[Java]ImageIO.write(bufferedImage)报错或者图片变色不换JDK的问题解决

2021-12-21 205点热度 0人点赞 0条评论

问题描述

在做图片处理(JPG)的时候,调用

// 此代码报错
ImageIO.write(bufferedImage, "jpg", out);

发现开发环境正常,但是服务器上报错:

java.lang.RuntimeException: javax.imageio.IIOException: Invalid argument to native writeImage

发现服务器上是OpenJDK,而本机开发环境是OracleJDK,找了另一台安装OracleJDK是果然是正常的。换服务器的JDK也是一个办法,不过服务器上能不动就不动,所以还是希望能想想其他办法。

问题解决

查了网上的说法,应该是OpenJDK处理JPG,缺少一个什么A通道(只支持TYPE_INT_BGR),具体咱也不是很懂,不过可以简单一点,再用JDK支持的BufferedImage.TYPE_INT_BGR写一次到一个新的BufferedImage,

方法如下:

private static BufferedImage ensureOpaque(BufferedImage bi) {
    if (bi.getTransparency() == BufferedImage.OPAQUE)
        return bi;
    int width = bi.getWidth();
    int height =bi.getHeight();
    BufferedImage bufferedImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_BGR);
    Graphics g = bufferedImage.getGraphics();
    g.setColor(Color.WHITE); // 这里我把背景设置了白色,发现如果没有这个,背景是黑色,看需要
    g.fillRect(0, 0, width, height);
    g.drawImage(bi, 0, 0, null);
    g.dispose();
    return bufferedImage;
}

然后再ImageIO.write的时候,使用转换后的BufferedImage就可以了

// 转换下
BufferedImage bufferedImage2 = ensureOpaque(bufferedImage);
ImageIO.write(bufferedImage2, "jpg", out);

 

 

admin

这个人很懒,什么都没留下

文章评论

您需要 登录 之后才可以评论