Réglage de la compression jpg niveau avec ImageIO en Java
Je suis en utilisant javax.imageio.ImageIO
pour enregistrer un BufferedImage
comme un fichier jpeg.
En particulier, j'ai créé le suivant: Java fonction:
public static void getScreenShot(BufferedImage capture, Path folder, String filename) {
try {
ImageIO.write(capture, "jpeg", new File(folder.toString()+"/"+filename+".jpg"));
} catch (AWTException | IOException ex) {
Logger.getLogger(ScreenShotMaker.class.getName()).log(Level.SEVERE, null, ex);
}
}
De même, toute logiciel de manipulation d'images, je souhaite changer le niveau de compression du fichier jpeg. Cependant, je suis à la recherche de cette option qui semble manquer dans ImageIO
.
Puis-je définir le niveau de compression et comment?
Vous devez vous connecter pour publier un commentaire.
Vous devez utiliser
JPEGImageWriteParam
puis enregistrer l'image avecImageWriter.write()
. Avant d'écrire, réglez la sortie viaImageWriter.setOutput
.Définir le niveau de compression comme suit:
Où
1f
est un nombre à virgule qui représente 100% de qualité. La valeur par défaut est autour de 70% si je ne me souviens pas de mal.MODIFIER
Ensuite, vous devez procédez comme suit pour obtenir une instance d'un
ImageWriter
. Il y a deux façons, une courte et une longue (je garde les deux, juste au cas où).La court chemin (suggéré par lapo dans un commentaire) est:
ou plus long chemin
ImageWriter writer = ImageIO.getImageWritersByFormatName("jpg").next();
jpegParams.getCompressionQuality()
sans réglage. (Vous n'avez encore besoin de mettrejpegParams.setCompressionMode(ImageWriteParam.MODE_EXPLICIT)
en premier.) La valeur par défaut, du moins pour moi, est0.75
.FileImageOutputStream
Une manière plus succincte est d'obtenir le
ImageWriter
directement à partir deImageIO
:L'appel à
ImageWriteParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT)
est nécessaire afin de définir explicitement la compression de niveau (de qualité).Dans
ImageWriteParam.setCompressionQuality()
1.0f
est une qualité maximale, minimale de compression, tandis que0.0f
est de qualité minimum, le maximum de la compression.ImageWriter.setOutput
doit être passé unImageOutputStream
. Bien que la méthode accepteObject
, selon la documentation, il n'est généralement pas pris en charge:La plupart des cas devraient être traités par ces deux classes:
FileImageOutputStream
- une mise en œuvre deImageOutputStream
qui écrit sa sortie directement à unFile
ouRandomAccessFile
.MemoryCacheImageOutputStream
- une mise en œuvre deImageOutputStream
qui écrit sa sortie à un régulièreOutputStream
. Généralement utilisé avecByteArrayOutputStream
(merci pour l'astuce, @lmiguelmh!).ByteArrayOutputStream baos = new ByteArrayOutputStream(); writer.setOutput(new MemoryCacheImageOutputStream(baos)); ... baos.flush(); byte[] returnImage = baos.toByteArray(); baos.close();
ByteArrayOutputStream
directement, Vous obtiendrezjava.lang.IllegalArgumentException: Illegal output type!
jpgWriter.setOutput(ImageIO.createImageOutputStream(new File(path)))
que quelque chose n'allait pas avecFileImageOutputStream
.