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;
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容