參考博文:java
http://blog.csdn.net/kobejayandy/article/details/44346809git
http://blog.csdn.net/shixing_11/article/details/6897871github
http://blog.csdn.net/cuihailiang/article/details/52037389apache
Java上傳圖片時,對某些圖片進行縮放、裁剪或者生成縮略圖時會蒙上一層紅色,通過檢查只要通過ImageIO.read()方法讀取後再保存,該圖片便已經變成紅圖。所以,能夠推測直接緣由在於ImageIO.read()方法加載圖片的過程存在問題。less
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圖片格式中的一種頭部信息,致使渲染圖片前景色時蒙上一層紅色。測試
一、使用awt Toolkitui
再也不使用ImageIO.read()方法加載圖片,而使用JDK中提供的Image src=Toolkit.getDefaultToolkit().getImagespa
Image src = Toolkit.getDefaultToolkit().getImage(file.getPath()); BufferedImage image = BufferedImageBuilder.toBufferedImage(src);//Image to BufferedImage
或者Toolkit.getDefaultToolkit().createImage.net
1 Image imageTookit = Toolkit.getDefaultToolkit().createImage(bytes); 2 BufferedImage cutImage = BufferedImageBuilder.toBufferedImage(imageTookit);
BufferedImageBuilder源碼:code
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; }
若是該方法在Windows平臺下使用正常,而在Linux平臺上老是報異常,這種解決方式能夠參考:http://blog.csdn.net/shixing_11/article/details/6897871/
二、使用阿里巴巴的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 package com.sup.test; 2 3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6 7 import org.apache.commons.io.IOUtils; 8 9 import com.alibaba.simpleimage.ImageRender; 10 import com.alibaba.simpleimage.SimpleImageException; 11 import com.alibaba.simpleimage.render.ReadRender; 12 import com.alibaba.simpleimage.render.ScaleParameter; 13 import com.alibaba.simpleimage.render.ScaleRender; 14 import com.alibaba.simpleimage.render.WriteRender; 15 16 public class Example { 17 18 public static void compressPicAlibaba (String srcFilePath, String descFilePath) { 19 File in = new File(srcFilePath); //原圖片 20 File out = new File(descFilePath); //目的圖片 21 ScaleParameter scaleParam = new ScaleParameter(); 22 23 FileInputStream inStream = null; 24 FileOutputStream outStream = null; 25 WriteRender wr = null; 26 try { 27 inStream = new FileInputStream(in); 28 outStream = new FileOutputStream(out); 29 ImageRender rr = new ReadRender(inStream); 30 ImageRender sr = new ScaleRender(rr, scaleParam); 31 wr = new WriteRender(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 void main(String[] args) { 50 51 String srcFilePath = "F:\\qw.jpg"; 52 String descFilePath = "F:\\qw2.jpg"; 53 compressPicAlibaba(srcFilePath, descFilePath); 54 55 } 56 57 }