java處理圖片時,使圖片蒙上一層紅色的解決方案

  項目中有導出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

  1. Image imageTookit = Toolkit.getDefaultToolkit().createImage(bytes);  
  2. BufferedImage cutImage = BufferedImageBuilder.toBufferedImage(imageTookit); 

另附上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處理圖片時蒙上紅色的問題已經解決!!!圖片處理

相關文章
相關標籤/搜索