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

问题现象:

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=Toolkit.getDefaultToolkit().getImage


[java] view plain copy 

  1. Image src=Toolkit.getDefaultToolkit().getImage(file.getPath());  

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


或者Toolkit.getDefaultToolkit().createImage



[java] view plain copy 

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

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


BufferedImageBuilder源码:



[java] view plain copy 

  1. public static BufferedImage toBufferedImage(Image p_w_picpath) {  

  2.         if (p_w_picpath instanceof BufferedImage) {  

  3.             return (BufferedImage) p_w_picpath;  

  4.         }  

  5.         // This code ensures that all the pixels in the p_w_picpath are loaded  

  6.         p_w_picpath = new ImageIcon(p_w_picpath).getImage();  

  7.         BufferedImage bp_w_picpath = 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.             bp_w_picpath = gc.createCompatibleImage(p_w_picpath.getWidth(null),  

  15.                     p_w_picpath.getHeight(null), transparency);  

  16.         } catch (HeadlessException e) {  

  17.             // The system does not have a screen  

  18.         }  

  19.         if (bp_w_picpath == null) {  

  20.             // Create a buffered p_w_picpath using the default color model  

  21.             int type = BufferedImage.TYPE_INT_RGB;  

  22.             bp_w_picpath = new BufferedImage(p_w_picpath.getWidth(null),  

  23.                     p_w_picpath.getHeight(null), type);  

  24.         }  

  25.         // Copy p_w_picpath to buffered p_w_picpath  

  26.         Graphics g = bp_w_picpath.createGraphics();  

  27.         // Paint the p_w_picpath onto the buffered p_w_picpath  

  28.         g.drawImage(p_w_picpath, 00null);  

  29.         g.dispose();  

  30.         return bp_w_picpath;  

  31.     }  


参考:

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