问题描述
在做图片处理(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);
文章评论