博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java - 处理某些图片泛红
阅读量:7060 次
发布时间:2019-06-28

本文共 4807 字,大约阅读时间需要 16 分钟。

参考博文:

http://blog.csdn.net/kobejayandy/article/details/44346809

http://blog.csdn.net/shixing_11/article/details/6897871

http://blog.csdn.net/cuihailiang/article/details/52037389

问题现象:

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图片格式中的一种头部信息,导致渲染图片前景色时蒙上一层红色。

解决方案:

1、使用awt Toolkit

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

Image src = Toolkit.getDefaultToolkit().getImage(file.getPath());  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源码:

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;      }

如果该方法在Windows平台下使用正常,而在Linux平台上总是报异常,这种解决方式可以参考:http://blog.csdn.net/shixing_11/article/details/6897871/

2、使用阿里巴巴的SImpleImage

主要依赖以下jar包:commons-io-2.4.jar、commons-lang.jar、commons-logging-1.1.1.jar、jai_codec-1.1.3.jar、jai_core-1.1.3.jar

SimpleImage github地址:
相关jar包下载:

测试代码:

1 package com.sup.test; 2  3 import java.io.File; 4 import java.io.FileInputStream; 5 import java.io.FileOutputStream; 6  7 import org.apache.commons.io.IOUtils; 8  9 import com.alibaba.simpleimage.ImageRender;10 import com.alibaba.simpleimage.SimpleImageException;11 import com.alibaba.simpleimage.render.ReadRender;12 import com.alibaba.simpleimage.render.ScaleParameter;13 import com.alibaba.simpleimage.render.ScaleRender;14 import com.alibaba.simpleimage.render.WriteRender;15 16 public class Example {17 18     public static void compressPicAlibaba (String srcFilePath, String descFilePath) {19         File in = new File(srcFilePath);      //原图片  20         File out = new File(descFilePath);       //目的图片  21         ScaleParameter scaleParam = new ScaleParameter();22            23         FileInputStream inStream = null;  24         FileOutputStream outStream = null;  25         WriteRender wr = null;  26         try {  27             inStream = new FileInputStream(in);  28             outStream = new FileOutputStream(out);  29             ImageRender rr = new ReadRender(inStream);  30             ImageRender sr = new ScaleRender(rr, scaleParam);  31             wr = new WriteRender(sr, outStream);  32            33             wr.render();                            //触发图像处理  34         } catch(Exception e) {  35             e.printStackTrace();  36         } finally {  37             IOUtils.closeQuietly(inStream);         //图片文件输入输出流必须记得关闭  38             IOUtils.closeQuietly(outStream);  39             if (wr != null) {  40                 try {  41                     wr.dispose();                   //释放simpleImage的内部资源  42                 } catch (SimpleImageException ignore) {  43                     // skip ...   44                 }  45             }  46         }  47     }48     49     public static void main(String[] args) {50         51         String srcFilePath = "F:\\qw.jpg";52         String descFilePath = "F:\\qw2.jpg";53         compressPicAlibaba(srcFilePath, descFilePath);54         55     }56 57 }

 

转载于:https://www.cnblogs.com/chenfeng1122/p/6142164.html

你可能感兴趣的文章
samba文件共享
查看>>
WannaCry勒索软件还在继续传播和感染中
查看>>
TarsGo新版本发布,支持protobuf,zipkin和自定义插件
查看>>
Snap up RS3gold 3500M 60% off rs3 for sale &learn
查看>>
oracle函数
查看>>
json与String的转化
查看>>
linux上解压版安装jdk,tomcat
查看>>
科略教育—企业为什么始终处于竞争状态?
查看>>
iphone开发
查看>>
解决:在微信中访问app下载链接提示“已停止访问该网页”
查看>>
使用阿里云ECS自建RDS MySQL从库
查看>>
Linux下sed命令
查看>>
胃病犯了怎么办
查看>>
三星2610打印机故障INTERNAL ERROR - Incomplete Session by time out
查看>>
马哥2016全新Linux+Python高端运维班第五周作业
查看>>
thinkphp 跨模块调用配置文件信息
查看>>
nohup命令在后台自动执行程序
查看>>
MAVEN项目后 jar包无法发布到eclipse的web服务器
查看>>
选择结构与循环结构
查看>>
Linux系统生成随机密码的10种方法
查看>>