6

当我尝试压缩 jpg 图像时,大多数情况下它工作得很好,但是一些 jpg 图像在压缩后变成绿色。这是我的代码

public void compressImage(String filename, String fileExtension) {
    BufferedImage img = null;
    try {
        File file = new File(filename);
        img = ImageIO.read(file);

        if (fileExtension.toLowerCase().equals(".png") || fileExtension.toLowerCase().equals(".gif")) {
            //Since there might be transparent pixel, if I dont do this,
            //the image will be all black.
            for (int x = 0; x < img.getWidth(); x++) {
                for (int y = 0; y < img.getHeight(); y++) {
                    int rgb = img.getRGB(x, y);
                    int alpha = (rgb >> 24) & 0xff;
                    if (alpha != 255) {
                        img.setRGB(x, y, -1); //set white
                    }
                }
            }
        }
        Iterator iter = ImageIO.getImageWritersByFormatName("jpg");
        //Then, choose the first image writer available
        ImageWriter writer = (ImageWriter) iter.next();
        //instantiate an ImageWriteParam object with default compression options
        ImageWriteParam iwp = writer.getDefaultWriteParam();
        //Set the compression quality
        iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
        iwp.setCompressionQuality(0.8f);
        //delete the file. If I dont the file size will stay the same
        file.delete();
        ImageOutputStream output = ImageIO.createImageOutputStream(new File(filename));
        writer.setOutput(output);
        IIOImage image = new IIOImage(img, null, null);
        writer.write(null, image, iwp);
        writer.dispose();
    } catch (IOException ioe) {
        logger.log(Level.SEVERE, ioe.getMessage());
    }
}

原始图像 压缩图像。 图像变绿

4

3 回答 3

1

将最终图像从YUVback 转换为RGB, 将恢复图像的颜色。这种转换对我有用:cv2.cvtColor(img_file, cv2.COLOR_YUV2RGB)

于 2021-12-08T10:54:46.490 回答
0

根据经验,我知道绿色是新格式化的 YUV 内存(尤其是 YV12)的颜色。所以我的猜测是某个步骤失败了,你得到了亮度信息,但色度被搞砸了。在我看来,它在到达 Cr 平面之前就失败了。

无论如何,祝你好运,这是一个艰难的过程。不过,您的代码看起来很奇怪——顶部奇怪的 png 特定代码是什么?AFAIK,如果您使用.NET,您几乎可以将任何已注册的图像格式视为没有任何有趣工作的图像。

于 2011-04-06T03:32:06.000 回答
0

我也有同样的问题。在我的测试服务器中运行 java 7 oracle 并且工作正常。在我的生产服务器中运行 openJDK 1.7,压缩图像变成绿色......在某些 JAVA 版本中似乎存在错误。

于 2016-08-03T04:46:08.980 回答