如何在JAVA中使用ImageWriter继续压缩图像?
我需要压缩每一个大于500千字节的图像。 所以,我正在尝试创建一个代码来测试每种压缩质量,直到我得到<;=500 kb,那么我将以最低的长度获得最好的质量
我最大的问题是ImageWriter中的writer方法将我的新图像附加到旧图像上。所以,如果我有一个600kb的图像,并且写了一个低质量的新图像,那么在同一个图像中,我将有600kb+500kb(新图像的大小)。jpg文件,质量很低
我的代码:
public byte[] imageCompressor(String filePath, String newFileName, String formatName) throws IOException {
File input = new File(filePath);
BufferedImage image = ImageIO.read(input);
File compressedImageFile = new File(newFileName);
String compressedWithFormat = compressedImageFile + "." + formatName;
OutputStream os = new FileOutputStream(compressedWithFormat);
Iterator<ImageWriter> writers = ImageIO.getImageWritersByFormatName(formatName);
ImageWriter writer = (ImageWriter) writers.next();
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageOutputStream ios = ImageIO.createImageOutputStream(os);
writer.setOutput(ImageIO.createImageOutputStream(baos));
ImageWriteParam param = writer.getDefaultWriteParam();
param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
writer.write(null, new IIOImage(image, null, null), param);
float contador = 1f;
while (imageSizeChecker(compressedWithFormat) > 500) {
param.setCompressionQuality(contador -= 0.09f); // Change the quality value you prefer
writer.write(null, new IIOImage(image, null, null), param);
System.out.println(imageSizeChecker(compressedWithFormat));
writer.dispose();
}
writer.dispose();
return baos.toByteArray();
}
public Long imageSizeChecker(String filePath) {
File insertFile = new File(filePath);
Long fileSize = insertFile.length() / 1024;
return fileSize;
}
此外,我希望以字节数组的形式返回图像(如下所示),并尝试以字节数组的形式发送参数上的图像文件(将String filepath替换为byte[]filepath)
# 1 楼答案
您不断将多个图像写入同一ByteArrayOutputStream。要重置输出流并丢弃每个图像之间的数据,可以使用:
还有其他几个问题,比如检查一个从未编写过的文件,但如果发现附加数据是主要问题,这似乎就是原因