Java处理某些图片红色问题

来源:互联网 发布:yii2.0源码 编辑:程序博客网 时间:2024/04/30 04:46

问题现象:

Java上传图片时,对某些图片进行缩放、裁剪或者生成缩略图时会蒙上一层红色,经过检查只要经过ImageIO.read()方法读取后再保存,该图片便已经变成红图。因此,可以推测直接原因在于ImageIO.read()方法加载图片的过程存在问题。

[java] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. public static BufferedImage getImages(byte[] data) throws IOException {  
  2.         ByteArrayInputStream input = new ByteArrayInputStream(data);  
  3.         return ImageIO.read(input);  
  4.     }  
public static BufferedImage getImages(byte[] data) throws IOException {        ByteArrayInputStream input = new ByteArrayInputStream(data);        return ImageIO.read(input);    }

经过查阅得知ImageIO.read()方法读取图片时可能存在不正确处理图片ICC信息的问题,ICC为JPEG图片格式中的一种头部信息,导致渲染图片前景色时蒙上一层红色。

解决方案:

不再使用ImageIO.read()方法加载图片,而使用JDK中提供的Image src=Toolkit.getDefaultToolkit().getImage

[java] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. Image src=Toolkit.getDefaultToolkit().getImage(file.getPath());  
  2. BufferedImage image=BufferedImageBuilder.toBufferedImage(src);//Image to BufferedImage  
Image src=Toolkit.getDefaultToolkit().getImage(file.getPath());BufferedImage image=BufferedImageBuilder.toBufferedImage(src);//Image to BufferedImage

或者Toolkit.getDefaultToolkit().createImage

[java] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. Image imageTookit = Toolkit.getDefaultToolkit().createImage(bytes);  
  2. BufferedImage cutImage = BufferedImageBuilder.toBufferedImage(imageTookit);  
Image imageTookit = Toolkit.getDefaultToolkit().createImage(bytes);BufferedImage cutImage = BufferedImageBuilder.toBufferedImage(imageTookit);

BufferedImageBuilder源码:

[java] view plain copy
print?在CODE上查看代码片派生到我的代码片
  1. public static BufferedImage toBufferedImage(Image image) {  
  2.         if (image instanceof BufferedImage) {  
  3.             return (BufferedImage) image;  
  4.         }  
  5.         // This code ensures that all the pixels in the image are loaded  
  6.         image = new ImageIcon(image).getImage();  
  7.         BufferedImage bimage = null;  
  8.         GraphicsEnvironment ge = GraphicsEnvironment  
  9.                 .getLocalGraphicsEnvironment();  
  10.         try {  
  11.             int transparency = Transparency.OPAQUE;  
  12.             GraphicsDevice gs = ge.getDefaultScreenDevice();  
  13.             GraphicsConfiguration gc = gs.getDefaultConfiguration();  
  14.             bimage = gc.createCompatibleImage(image.getWidth(null),  
  15.                     image.getHeight(null), transparency);  
  16.         } catch (HeadlessException e) {  
  17.             // The system does not have a screen  
  18.         }  
  19.         if (bimage == null) {  
  20.             // Create a buffered image using the default color model  
  21.             int type = BufferedImage.TYPE_INT_RGB;  
  22.             bimage = new BufferedImage(image.getWidth(null),  
  23.                     image.getHeight(null), type);  
  24.         }  
  25.         // Copy image to buffered image  
  26.         Graphics g = bimage.createGraphics();  
  27.         // Paint the image onto the buffered image  
  28.         g.drawImage(image, 00null);  
  29.         g.dispose();  
  30.         return bimage;  
  31.     }  
public static BufferedImage toBufferedImage(Image image) {        if (image instanceof BufferedImage) {            return (BufferedImage) image;        }        // This code ensures that all the pixels in the image are loaded        image = new ImageIcon(image).getImage();        BufferedImage bimage = null;        GraphicsEnvironment ge = GraphicsEnvironment                .getLocalGraphicsEnvironment();        try {            int transparency = Transparency.OPAQUE;            GraphicsDevice gs = ge.getDefaultScreenDevice();            GraphicsConfiguration gc = gs.getDefaultConfiguration();            bimage = gc.createCompatibleImage(image.getWidth(null),                    image.getHeight(null), transparency);        } catch (HeadlessException e) {            // The system does not have a screen        }        if (bimage == null) {            // Create a buffered image using the default color model            int type = BufferedImage.TYPE_INT_RGB;            bimage = new BufferedImage(image.getWidth(null),                    image.getHeight(null), type);        }        // Copy image to buffered image        Graphics g = bimage.createGraphics();        // Paint the image onto the buffered image        g.drawImage(image, 0, 0, null);        g.dispose();        return bimage;    }


0 0
原创粉丝点击