有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

如何在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) 个答案

  1. # 1 楼答案

    您不断将多个图像写入同一ByteArrayOutputStream。要重置输出流并丢弃每个图像之间的数据,可以使用:

    baos.reset();
    

    还有其他几个问题,比如检查一个从未编写过的文件,但如果发现附加数据是主要问题,这似乎就是原因