Ich versuche ein PNG Bild (6.8 MB) zu komprimieren, um seine Größe zu reduzieren, aber ich stehe vor dem Problem, dass ich zu viel von seiner Quilty verliere. Auch wenn ich diese Zeile kommentierensetze den richtigen Wert auf setCompressionQuality() wenn ich das Bild komprimiere
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(0.9f);
I, wie in den Screenshots ein Bild bekommen, aber mit einer Größe von (812 KB). Mit den Linien bekomme ich ein PNG Bild mit der Größe von (1,24 MB) aber in beiden Fällen bekomme ich das Bild wie in den Screenshots ohne Unterschied in der Quility (auch mit schwarzem Hintergrund). Wie kann das Bild besser komprimiert werden? Auch ich dachte, ich könnte die Qualität vlaue konfigurieren, indem Sie einen Float-Wert zwischen 0-1 als die folgende setCompressionQuality (0.9f);
package ImageCompressor;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Iterator;
import javax.imageio.IIOImage;
import javax.imageio.ImageIO;
import javax.imageio.ImageWriteParam;
import javax.imageio.ImageWriter;
import javax.imageio.stream.ImageOutputStream;
public class ImageComprossor {
public static void main(String[] args) {
BufferedImage img = null;
try {
File input = new File("strawberry.png");
BufferedImage image = ImageIO.read(input);
File compressedImageFile = new File("strawberry_compressed.png");
OutputStream os = new FileOutputStream(compressedImageFile);
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName("jpg");
ImageWriter writer = writers.next();
ImageOutputStream ios = ImageIO.createImageOutputStream(os);
writer.setOutput(ios);
ImageWriteParam param = writer.getDefaultWriteParam();
// Check if canWriteCompressed is true
if (param.canWriteCompressed()) {
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
param.setCompressionQuality(0.9f);
}
// End of check
writer.write(null, new IIOImage(image, null, null), param);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Warum verwenden Sie 'jpg', um den' ImageWriter' zu erhalten? Wenn Sie zu 'ImageIO.getImageWritersByFormatName (" png ")' wechseln und dann versuchen, die verfügbaren Komprimierungstypen zu erhalten (zB 'param.getCompressionTypes()'), erhalten Sie eine 'java.lang.UnsupportedOperationException: Compression nicht unterstützt '. –