首页 > 代码库 > Java处理某些图片红色问题

Java处理某些图片红色问题

百度了  微信平台上传图片变红  找到这个解决办法

问题现象:

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


[java] view plain copy 技术分享技术分享

  1. public static BufferedImage getImages(byte[] data) throws IOException {  

  2.         ByteArrayInputStream input = new ByteArrayInputStream(data);  

  3.         return ImageIO.read(input);  

  4.     }  


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

解决方案:

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


[java] view plain copy 技术分享技术分享

  1. Image src=http://www.mamicode.com/Toolkit.getDefaultToolkit().getImage(file.getPath());

  2. BufferedImage image=BufferedImageBuilder.toBufferedImage(src);//Image to BufferedImage  


或者Toolkit.getDefaultToolkit().createImage



[java] view plain copy 技术分享技术分享

  1. Image imageTookit = Toolkit.getDefaultToolkit().createImage(bytes);  

  2. BufferedImage cutImage = BufferedImageBuilder.toBufferedImage(imageTookit);  


BufferedImageBuilder源码:



[java] view plain copy 技术分享技术分享

  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.     }  


参考:

http://blog.csdn.net/kobejayandy/article/details/44346809


Java处理某些图片红色问题