Java ImageIO.read() 处理上传的图片有红色蒙版问题

Java 处理上传的图片,使用ImageIO.read()读取后可能使图片覆盖一层红色的蒙版,问题如下:

QQ图片20180724145140.jpg

原因是ImageIO.read()方法不能正确处理图片ICC信息,ICC为JPEG图片格式中的一种头部信息,导致渲染图片前景色时蒙上一层红色。

源代码:

BufferedImage originalImage = ImageIO.read(upload);

修改后的代码:

Image src = Toolkit.getDefaultToolkit().getImage(upload.getPath());
BufferedImage originalImage = toBufferedImage(src);//Image to BufferedImage  

其中 toBufferedImage() 方法定义如下:

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 ImageIO.read() 处理上传的图片有红色蒙版问题)