項目中有導出excel的功能,excel中包含圖片,以前作的時候有些圖片被蒙上了一層紅色(當時發現內存大一點的圖片會被蒙上紅色,因此錯誤的覺得這是圖片大小的問題,想從壓縮圖片大小的方向上去解決)java
最近項目準備上線了,這個問題又被拋出來了,經查閱資料發現,原來是在圖片加載的時候出了問題 , 以前的代碼: // 讀取本地圖片,指定圖片類型爲jpg
public void setPicture(HSSFWorkbook wb, HSSFPatriarch patriarch, String pic, int iRowStart, int iColStart, int iRowStop, int iColStop) throws IOException {
// 判斷文件是否存在
File imgFile = new File(pic);
if (imgFile.exists()) {
// 圖片處理
ByteArrayOutputStream byteArrayOut = new ByteArrayOutputStream();
BufferedImage bufferImg = ImageIO.read(imgFile);
ImageIO.write(bufferImg, "jpg", byteArrayOut);
// 左,上(0-255),右(0-1023),下
HSSFClientAnchor anchor = new HSSFClientAnchor(20, 1, 1018, 0, (short) (iColStart), iRowStart, (short) (iColStop), iRowStop);
patriarch.createPicture(anchor, wb.addPicture(byteArrayOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));
}
}less
這是導出excel中,讀取本地圖片並指定圖片格式爲jpg的代碼,後來查閱資料發現ImageIO.read(imgFile)方法讀取圖片時可能存在不正確處理圖片ICC信息的問題,ICC爲JPEG圖片格式中的一種頭部信息,致使渲染圖片前景色時蒙上一層紅色。ui
解決方案:spa
使用JDK中提供的Image src=Toolkit.getDefaultToolkit().getImage 將BufferedImage bufferImg = ImageIO.read(imgFile);改成 excel
Image src=Toolkit.getDefaultToolkit().getImage(imgFile.getPath());
BufferedImage bufferImg=BufferedImageBuilder.toBufferedImage(src);//我用的就是這方法,親測可行,網上還有另外一種方法code
另附上BufferedImageBuilder源碼(直接從網上copy的,感謝大神):圖片
public class BufferedImageBuilder {
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;
}
}內存
至此,java處理圖片時蒙上紅色的問題已經解決!!!圖片處理