【问题标题】:Problem converting PNG to JPG using Java (ImageIO.write()) [duplicate]使用Java(ImageIO.write())将PNG转换为JPG时出现问题[重复]
【发布时间】:2009-12-02 01:09:06
【问题描述】:

我正在使用 ImageIO.write() 将 PNG 文件转换为 JPG。出于某种原因,我的结果图像上面有一个粉红色的图层。我已经广泛搜索了解决方案,但没有找到任何解决方案。该代码适用于除 PNG 以外的所有其他类型的图像。

【问题讨论】:

    标签: java javax.imageio


    【解决方案1】:

    我不确定其他代码 sn-p 是如何工作的,因为缓冲区在创建后未使用。我发现这个粉色问题是特定于 jvm 版本的。

    我发现的最简单的解决方案就是这样做。

    BufferedImage image = null;
    BufferedImage imageRGB = null;
    
    // imageBytes is some png file you read
    image = ImageIO.read(new ByteArrayInputStream(imageBytes));
    
    // Attempt at PNG read fix
    imageRGB = new BufferedImage(image.getWidth(),
        image.getHeight(), BufferedImage.TYPE_INT_RGB);
    
    // write data into an RGB buffered image, no transparency
    imageRGB.setData(image.getData());
    
    // return the RGB buffered image, or do ImageIO.write( ... );
    return imageRGB; // fixed for jpeg
    

    【讨论】:

    • 这个解决方案在我的情况下不起作用 - 它会创建一个带有垂直线的灰度图像。
    • 在 JavaFX 中无法将图像另存为 .jpg。
    • 我的 setData() 部分运气不好 - 像@Robert 提到的那样,图像开发线。看起来 4 个字节的数据被压缩到一个 3 个字节的孔中,这就是从 ARGB 转到 RBG 时发生的情况。无论如何,imageRGB.createGraphics().drawImage(image, null, null); 可以代替。
    • 我得到和罗伯特一样的,带有垂直线条的灰度图像。对不起。
    • 但是,@KevinL 的更改确实有效 - 图像的非透明部分得到了正确转换。但是透明度变成了黑色。将不得不摆弄那个。
    【解决方案2】:

    快速阅读标记为 ImageIO 的其他 SO 答案导致 this

    根本原因可能是阅读器有问题。建议的解决方法是使用不同的阅读器包。

    编辑上面的链接坏了,但this似乎是它。

    编辑以上链接失效,here it is on archive.org

    【讨论】:

    • 您对其他阅读器包有什么建议吗?我正在使用 javax.imageio.ImageIO。不知道还有其他人在那里。
    • 我链接的页面上的链接是jai-imageio.dev.java.net
    【解决方案3】:

    我也有同样的问题,但是如果我用png格式写它就可以解决了。

    类似的,

    ImageIO.write(resizedImageBuffer, "png", baos);
    

    【讨论】:

    • 从 png 转换为 png 并不是真正的答案
    【解决方案4】:

    我发现这个link 有一些可能有用的代码。我用我的一些图片尝试了你的代码,但我无法重现这个问题。我尝试了 devyn_a 的最后一个答案,它没有破坏任何东西。这是使用 devyn_a 的解决方案修改的代码。

    String url = "file:///d:/teststuff/IMG_0393.JPG";
    String to = "d:/teststuff/out.jpg";
    BufferedImage oldImage = ImageIO.read(new URL(url));
    BufferedImage buffer = new BufferedImage (oldImage.getWidth(),
                     oldImage.getHeight(), BufferedImage.TYPE_INT_RGB);
    ImageIO.write(ImageIO.read(new URL(url)), "jpg", new File(to));
    

    想知道这是否能解决问题。

    【讨论】:

    • 嗯,我完全不明白这个答案。 oldImage 和 buffer 在创建后就不用了,为什么要帮忙呢?
    • 创建黑色图像。
    猜你喜欢
    • 2015-10-06
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 2019-08-10
    • 1970-01-01
    • 1970-01-01
    • 2021-06-18
    • 2011-11-16
    相关资源
    最近更新 更多