java 图片合成 红色失真_Java - 处理某些图片泛红
參考博文:
http://blog.csdn.net/kobejayandy/article/details/44346809
http://blog.csdn.net/shixing_11/article/details/6897871
http://blog.csdn.net/cuihailiang/article/details/52037389
問題現象:
Java上傳圖片時,對某些圖片進行縮放、裁剪或者生成縮略圖時會蒙上一層紅色,經過檢查只要經過ImageIO.read()方法讀取后再保存,該圖片便已經變成紅圖。因此,可以推測直接原因在于ImageIO.read()方法加載圖片的過程存在問題。
1 public static BufferedImage getImages(byte[] data) throwsIOException {2 ByteArrayInputStream input = newByteArrayInputStream(data);3 returnImageIO.read(input);4 }
經過查閱得知ImageIO.read()方法讀取圖片時可能存在不正確處理圖片ICC信息的問題,ICC為JPEG圖片格式中的一種頭部信息,導致渲染圖片前景色時蒙上一層紅色。
解決方案:
1、使用awt?Toolkit
不再使用ImageIO.read()方法加載圖片,而使用JDK中提供的Image src=Toolkit.getDefaultToolkit().getImage
Image src = Toolkit.getDefaultToolkit().getImage(file.getPath());
BufferedImage image= BufferedImageBuilder.toBufferedImage(src);//Image to BufferedImage
或者Toolkit.getDefaultToolkit().createImage
1 Image imageTookit =Toolkit.getDefaultToolkit().createImage(bytes);2 BufferedImage cutImage = BufferedImageBuilder.toBufferedImage(imageTookit);
BufferedImageBuilder源碼:
public staticBufferedImage toBufferedImage(Image image) {if (image instanceofBufferedImage) {return(BufferedImage) image;
}//This code ensures that all the pixels in the image are loaded
image = newImageIcon(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();returnbimage;
}
如果該方法在Windows平臺下使用正常,而在Linux平臺上總是報異常,這種解決方式可以參考:http://blog.csdn.net/shixing_11/article/details/6897871/
2、使用阿里巴巴的SImpleImage
主要依賴以下jar包:commons-io-2.4.jar、commons-lang.jar、commons-logging-1.1.1.jar、jai_codec-1.1.3.jar、jai_core-1.1.3.jar
SimpleImage github地址:https://github.com/alibaba/simpleimage
相關jar包下載:http://download.csdn.net/detail/asd1231510/8911263
測試代碼:
1 packagecom.sup.test;2
3 importjava.io.File;4 importjava.io.FileInputStream;5 importjava.io.FileOutputStream;6
7 importorg.apache.commons.io.IOUtils;8
9 importcom.alibaba.simpleimage.ImageRender;10 importcom.alibaba.simpleimage.SimpleImageException;11 importcom.alibaba.simpleimage.render.ReadRender;12 importcom.alibaba.simpleimage.render.ScaleParameter;13 importcom.alibaba.simpleimage.render.ScaleRender;14 importcom.alibaba.simpleimage.render.WriteRender;15
16 public classExample {17
18 public static voidcompressPicAlibaba (String srcFilePath, String descFilePath) {19 File in = new File(srcFilePath); //原圖片
20 File out = new File(descFilePath); //目的圖片
21 ScaleParameter scaleParam = newScaleParameter();22
23 FileInputStream inStream = null;24 FileOutputStream outStream = null;25 WriteRender wr = null;26 try{27 inStream = newFileInputStream(in);28 outStream = newFileOutputStream(out);29 ImageRender rr = newReadRender(inStream);30 ImageRender sr = newScaleRender(rr, scaleParam);31 wr = newWriteRender(sr, outStream);32
33 wr.render(); //觸發圖像處理
34 } catch(Exception e) {35 e.printStackTrace();36 } finally{37 IOUtils.closeQuietly(inStream); //圖片文件輸入輸出流必須記得關閉
38 IOUtils.closeQuietly(outStream);39 if (wr != null) {40 try{41 wr.dispose(); //釋放simpleImage的內部資源
42 } catch(SimpleImageException ignore) {43 //skip ...
44 }45 }46 }47 }48
49 public static voidmain(String[] args) {50
51 String srcFilePath = "F:\\qw.jpg";52 String descFilePath = "F:\\qw2.jpg";53 compressPicAlibaba(srcFilePath, descFilePath);54
55 }56
57 }
總結
以上是生活随笔為你收集整理的java 图片合成 红色失真_Java - 处理某些图片泛红的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 同方专转本计算机视频,同方2011专转本
- 下一篇: The mook jong 计数DP