JAVA处理不正确处理图片ICC信息蒙上红色的问题 放弃ImageIO.read()

简介: 问题现象: Java上传图片时,对某些图片进行缩放、裁剪或者生成缩略图时会蒙上一层红色,原因乃是ImageIO.read()方法读取图片时可能存在不正确处理图片ICC信息的问题,ICC为JPEG图片格式中的一种头部信息,导致渲染图片前景色时蒙上一层红色。 [java] view plain copy public stati

问题现象:

JAVA处理不正确处理图片ICC信息蒙上红色的问题现象

Java上传图片时,对某些图片进行缩放、裁剪或者生成缩略图时会蒙上一层红色原因乃是ImageIO.read()方法读取图片时可能存在不正确处理图片ICC信息的问题,ICC为JPEG图片格式中的一种头部信息,导致渲染图片前景色时蒙上一层红色。

[java]  view plain  copy
  1. public static BufferedImage getImages(byte[] data) throws IOException {  
  2.         ByteArrayInputStream input = new ByteArrayInputStream(data);  
  3.         return ImageIO.read(input);  
  4.     }  

解决方案:

不再使用ImageIO.read()方法加载图片,而使用JDK中提供的Image src=Toolkit.getDefaultToolkit().getImage

[java]  view plain  copy
  1. Image src=Toolkit.getDefaultToolkit().getImage(file.getPath());  
  2. BufferedImage image=BufferedImageBuilder.toBufferedImage(src);//Image to BufferedImage  

或者Toolkit.getDefaultToolkit().createImage

[java]  view plain  copy
  1. Image imageTookit = Toolkit.getDefaultToolkit().createImage(bytes);  
  2. BufferedImage cutImage = BufferedImageBuilder.toBufferedImage(imageTookit);  

BufferedImageBuilder源码:

[java]  view plain  copy
  1. public static BufferedImage toBufferedImage(Image image) {  
  2.         if (image instanceof BufferedImage) {  
  3.             return (BufferedImage) image;  
  4.         }  
  5.         // This code ensures that all the pixels in the image are loaded  
  6.         image = new ImageIcon(image).getImage();  
  7.         BufferedImage bimage = null;  
  8.         GraphicsEnvironment ge = GraphicsEnvironment  
  9.                 .getLocalGraphicsEnvironment();  
  10.         try {  
  11.             int transparency = Transparency.OPAQUE;  
  12.             GraphicsDevice gs = ge.getDefaultScreenDevice();  
  13.             GraphicsConfiguration gc = gs.getDefaultConfiguration();  
  14.             bimage = gc.createCompatibleImage(image.getWidth(null),  
  15.                     image.getHeight(null), transparency);  
  16.         } catch (HeadlessException e) {  
  17.             // The system does not have a screen  
  18.         }  
  19.         if (bimage == null) {  
  20.             // Create a buffered image using the default color model  
  21.             int type = BufferedImage.TYPE_INT_RGB;  
  22.             bimage = new BufferedImage(image.getWidth(null),  
  23.                     image.getHeight(null), type);  
  24.         }  
  25.         // Copy image to buffered image  
  26.         Graphics g = bimage.createGraphics();  
  27.         // Paint the image onto the buffered image  
  28.         g.drawImage(image, 00null);  
  29.         g.dispose();  
  30.         return bimage;  
  31.     }

目录
相关文章
|
1月前
|
Java
Java开发实现图片URL地址检验,如何编码?
【10月更文挑战第14天】Java开发实现图片URL地址检验,如何编码?
67 4
|
1月前
|
Java
Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
【10月更文挑战第14天】Java开发实现图片地址检验,如果无法找到资源则使用默认图片,如何编码?
59 2
|
12天前
|
人工智能 监控 数据可视化
Java智慧工地信息管理平台源码 智慧工地信息化解决方案SaaS源码 支持二次开发
智慧工地系统是依托物联网、互联网、AI、可视化建立的大数据管理平台,是一种全新的管理模式,能够实现劳务管理、安全施工、绿色施工的智能化和互联网化。围绕施工现场管理的人、机、料、法、环五大维度,以及施工过程管理的进度、质量、安全三大体系为基础应用,实现全面高效的工程管理需求,满足工地多角色、多视角的有效监管,实现工程建设管理的降本增效,为监管平台提供数据支撑。
30 3
|
16天前
|
Java 编译器 开发者
Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面
本文探讨了Java异常处理的最佳实践,涵盖理解异常类体系、选择合适的异常类型、提供详细异常信息、合理使用try-catch和finally语句、使用try-with-resources、记录异常信息等方面,帮助开发者提高代码质量和程序的健壮性。
34 2
|
1月前
|
算法 Java Linux
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
这篇文章介绍了如何使用Java的Graphics2D类在图片上合成另一个照片,并将照片切割成圆形头像的方法。
49 1
java制作海报二:java使用Graphics2D 在图片上合成另一个照片,并将照片切割成头像,头像切割成圆形方法详解
|
1月前
|
Java 数据安全/隐私保护
Java ffmpeg 实现视频加文字/图片水印功能
【10月更文挑战第22天】在 Java 中使用 FFmpeg 实现视频加文字或图片水印功能,需先安装 FFmpeg 并添加依赖(如 JavaCV)。通过构建 FFmpeg 命令行参数,使用 `drawtext` 滤镜添加文字水印,或使用 `overlay` 滤镜添加图片水印。示例代码展示了如何使用 JavaCV 实现文字水印。
|
1月前
|
前端开发 小程序 Java
java基础:map遍历使用;java使用 Patten 和Matches 进行正则匹配;后端传到前端展示图片三种情况,并保存到手机
这篇文章介绍了Java中Map的遍历方法、使用Pattern和matches进行正则表达式匹配,以及后端向前端传输图片并保存到手机的三种情况。
20 1
|
1月前
|
算法 Java Linux
java制作海报四:java BufferedImage 转 InputStream 上传至OSS。png 图片合成到模板(另一个图片)上时,透明部分变成了黑色
这篇文章主要介绍了如何将Java中的BufferedImage对象转换为InputStream以上传至OSS,并解决了png图片合成时透明部分变黑的问题。
62 1
|
1月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
107 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
1月前
|
算法 小程序 Java
java制作海报三:获取微信二维码详情,并改变大小,合成到海报(另一张图片)上
这篇文章介绍了如何使用Java获取微信小程序的二维码,并将其调整大小后合成到海报(另一张图片)上。
41 0