Java处理某些图片红色问题

问题现象:

Java上传图片时,对某些图片进行缩放、裁剪或者生成缩略图时会蒙上一层红色,经过检查只要经过ImageIO.read()方法读取后再保存,该图片便已经变成红图。因此,可以推测直接原因在于ImageIO.read()方法加载图片的过程存在问题。

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

经过查阅得知ImageIO.read()方法读取图片时可能存在不正确处理图片ICC信息的问题,ICC为JPEG图片格式中的一种头部信息,导致渲染图片前景色时蒙上一层红色。
解决方案:

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

  1. Image src=Toolkit.getDefaultToolkit().getImage(file.getPath());  
  2. BufferedImage image=BufferedImageBuilder.toBufferedImage(src);//Image to BufferedImage  

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

BufferedImageBuilder源码:
  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.     } 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
处理图片性能低可能有多种原因,以下是一些常见的优化建议: 1. 图片压缩:使用适当的压缩算法来减小图片的文件大小,可以通过降低图片质量、调整分辨率或使用更高效的图片格式(如WebP)来实现。这可以减少网络传输和磁盘加载时间。 2. 图片缓存:在处理图片时,可以使用缓存来避免重复的加载和处理操作。将已经处理过的图片缓存起来,下次需要时直接从缓存中获取,避免重复的计算和IO操作。 3. 多线程处理:如果需要同时处理多张图片,可以考虑使用多线程来并行处理。将图片处理任务拆分成多个子任务,每个子任务在独立的线程中处理,以提高处理效率。 4. 图片格式优化:选择合适的图片格式可以提高处理性能。例如,对于需要透明背景的图片,使用PNG格式;对于颜色较少且无需透明背景的图片,使用GIF格式或JPEG格式。 5. 使用图像处理库:Java中有许多优秀的图像处理库,如ImageIO、OpenCV、Java Advanced Imaging(JAI)等。这些库提供了丰富的图像处理功能,并且经过了优化和性能调整。选择适合你需求的库,可以提高处理图片的性能。 6. 图片预加载:如果你的应用程序需要频繁地加载和显示图片,可以在需要时预加载图片,提前将图片加载到内存中。这样可以避免每次使用时都进行IO操作,减少加载时间和提高响应速度。 7. 优化算法和算法参数:在使用图像处理算法时,可以调整算法的参数或尝试其他优化算法,以达到更好的性能。例如,图像的缩放、裁剪、旋转等操作可以选择更高效的算法。 8. 监测和分析性能瓶颈:使用性能分析工具来监测和分析代码中的性能瓶颈。通过定位具体的性能问题,可以有针对性地进行优化。 需要根据具体情况选择适合的优化方法,并进行性能测试和评估,以确保达到预期的性能改善效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值