`

ImageIO.read()方法读取图片后重写,图片蒙上一层红色的解决办法

 
阅读更多

1.在项目中为了处理用户上传的图片,会对图片进行重写处理,故使用了类似下面的代码:

 

原图如下:

但发现对于CMYK模式的图片ImageIO.read方法在读取时,会丢失掉ICC信息,从面导致重写后的图片上面蒙受上一层红色如下:

显然对图片质量的影响非常大,在用户体验非常高的互联网上是没法让用户接受的,于是又改用另外一种获取Image对象的方法如下:

但该方法在Windows平台下使用正常,而在Linux平台上总是报异常如下:

然后按照网上的方法,运行的时候加了-Djava.awt.headless=true即 java -Djava.awt.headless=true ClassName 但接着报如下异常:

原因是:Toolkit.getDefaultToolkit()方法中有一句

其实这句话的意思是该程序运行需要有图片环境的支持,后来经过测试,在Linux开了图形窗口后运行也是正常的,但对于生产环境的服务器要开个图形界面是不太现实的,最终放弃了这种方案。经过探索在Linux下只能选用ImageMagick结合JMagick实现,此时能独立于X-11系统,请看下篇,ImageMagick,Jmagick-linux_64安装说明

注意:

1.使用Jimi1.0 版本,保存PICT文件格式时输出的图像宽、高和内存中的图像源一致,可是显示出来却是纯白的。这是 Jimi1.0 版本对写Pict格式的一处 BUG,下载了新的补订类PICTWriter.java 重新编译成PICTWriter.class加入 JimiProClasses.zip 中覆盖原有的 PICTWriter.class,遂写 PICT 格式成功。可以参考官方说明:http://amug.org/~glguerin/other/index.html#PICTWriter 编译时注意要兼容你的JDK版本。

2.关于ImageIO.read()方法读取图片时不能正确处理ICC信息的问题,一般这些图片,是由扫描仪扫描,或者数码相机拍摄,并且处理时,图片的颜色空间(colorspace)为CMYK模式,可以参考官方BUG说明:

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6245283

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6404011

另外处理相关ICC信息的代码如下:

其中*.pf色彩文件从http://java.sun.com/products/java-media/jai/downloads/download-1_0_2.html可取得。 

在经过一系列探索,《ImageIO.read()方法读取图片后重写,图片蒙上一层红色的解决办法(上)》篇已经通过Jimi初步解决,但在Linux平台下必须开图形界面才行,但现实情况,服务器一般运行在init 3级别下,init 5不太现实,另外Jimi对象图片的处理也较差,部分图片重写后质量降低,模糊等,由此也证明了Java语言在处理图片上的劣势,这是非常让人纠心的事,最终只能借助于无敌的ImageMagick结合对应的JNI接口JMagick来完成,上篇《ImageMagick,Jmagick-linux_64安装说明》已经介绍了该软件在Linux下的安装过程,下面我们看看使用JMagick如何实现图片高质量重写。

 


这样,彻底解决了图片跨平台处理的问题,而且服务器也不依赖于init 5级别运行。
分享到:
评论

相关推荐

    如何给面板或窗体添加背景图片

    创建一个继承自JPanel的子类,并重写`paintComponent`方法,将图片绘制到面板上。 ```java public class BackgroundPanel extends JPanel { private BufferedImage backgroundImage; public BackgroundPanel...

    java图片绘制和鼠标事件监听

    `ImageIO.read()`方法用于读取并加载图片。 接下来,我们讨论鼠标事件监听。Java提供了多种鼠标事件接口,如`MouseListener`, `MouseMotionListener`和`MouseWheelListener`,它们可以让你在用户与程序交互时执行...

    Java图片处理技术

    使用`File`类来操作文件,例如创建`File`对象表示图片文件路径,以及使用`ImageIO.read()`和`ImageIO.write()`方法读取和写入图像文件。 10. **方法签名**: 两个方法都被声明为`final static`,这意味着它们是类...

    java 复制图片到剪切板

    为了将图片转换为`Transferable`,我们需要实现一个类并重写`getTransferDataFlavors()`和`isDataFlavorSupported()`方法,以及`getTransferData()`方法,该方法将返回图像数据。这里我们使用`DataFlavor....

    JFrame中加载图片

    要在`JFrame`中显示图片,我们需要创建一个自定义的组件,通常是继承自`JPanel`,因为`JPanel`允许我们重写其`paintComponent()`方法,进行自定义绘图。 在`ImagePanelJFrame.java`中,我们可能会看到以下关键代码...

    java图片生成器

    例如,使用ImageIO.read()和ImageIO.write()方法可以方便地完成这个任务。 此外,你可能还需要了解色彩模型和颜色空间,比如RGB、CMYK和灰度模型。Java 2D API允许你在不同的颜色模型间转换,这对于图像处理和效果...

    view_image.rar_images view java_jpg view_view ima_view_image

    1. **Java中读取JPG图像**:要查看或处理JPG图像,我们通常会用到`ImageIO.read()`方法。例如: ```java import javax.imageio.ImageIO; import java.io.File; import java.awt.image.BufferedImage; BufferedImage...

    java小程序Applet显示图片

    在这个例子中,`drawImage()`方法用于在Applet上绘制图片,`this`参数表示绘图区域。 总结起来,Java小程序Applet通过继承`Applet`类并利用`ImageIO`和`Graphics`类可以实现图片的显示。尽管Applet已逐渐被淘汰,但...

    Java Http异步加载图片

    在Java编程中,异步加载图片是一项常见的任务,特别是在开发Android或者Web应用时,为了提高用户体验,我们需要在后台线程中加载图片,而不是阻塞主线程。本篇将深入讲解如何利用Java原生类实现Http异步加载图片的...

    java源码:Java图片倒影效果实例源码.rar

    实例中可能包含了读取图片文件的代码,如使用`ImageIO.read()`方法从文件加载图片。同时,如果需要保存处理后的图像,可以使用`ImageIO.write()`方法将`BufferedImage`写入到新的文件。 8. 事件处理 如果这个实例...

    java用图片构建一个个性窗体

    为了加载图片,我们可以使用`javax.imageio.ImageIO`类的`read()`方法,它能读取多种格式的图像文件。例如: ```java try { BufferedImage image = ImageIO.read(new File("path/to/your/image.jpg")); // 然后在...

    图像加水印

    1. **读取原始图片**:使用`ImageIO.read()`方法读取需要加水印的图片,并将其转换为`BufferedImage`对象。 2. **创建水印**:可以使用`Graphics2D`对象在新的`BufferedImage`上绘制水印。这包括设置字体、颜色、...

    Java实现图片裁剪预览

    例如,通过`ImageIO.read()`方法从文件中读取图像,然后可以将其显示在`javax.swing.JFrame`或`javax.swing.JLabel`中。对于预览,我们可以创建一个`BufferedImage`对象来存储裁剪后的图像,并在界面上实时更新。 3...

    有趣的图像改变,或许对初学者用帮助!!!

    你可以使用`ImageIO.read()`方法从文件中读取图像到`BufferedImage`对象。 然后,在`paintComponent`方法内,使用`Graphics2D`对象的`drawImage()`方法绘制图像。这需要传递四个参数:图像对象、图像在屏幕上的x...

    Ck.rar_时钟 java

    在这个时钟中,刻度图片可能通过`ImageIO.read()`方法加载到程序中。 - `BufferedImage`对象用于存储图片数据,可以被绘制到屏幕上。 3. **线程**: - 为了实现时钟实时更新,必须在一个单独的线程中运行,以免...

    java实现的模仿画图板的程序

    `ImageIO.read(File file)`方法可以读取指定文件的图像,然后将其绘制到画布上。 7. **保存与加载**: 为了保存用户的画作,可以将画布的`Graphics2D`对象转换为位图,然后使用`javax.imageio.ImageIO.write...

    java 画图程序 多窗体 多种画笔 橡皮 保存 文件 图片

    5. **图片处理**:为了加载和显示图片,我们可以使用`BufferedImage`类,配合`ImageIO.read()`方法读取图片文件。此外,还可以使用`Graphics2D`的`drawImage()`方法将图片绘制到画布上。如果需要对图片进行编辑,...

    java 显示一个图像的轮廓

    首先,创建一个`JFrame`,然后在其内容面板上添加一个`JPanel`,重写`paintComponent`方法以绘制边缘图像: ```java import javax.swing.JFrame; import javax.swing.JPanel; import java.awt.Graphics; public ...

    基于java+applet图片浏览小程序的设计与开发.zip

    可以使用`ImageIO.read()`方法从文件或流中读取图片。 - 图片显示:在Applet中,可以通过Graphics对象的`drawImage()`方法在画布上绘制图片。 - 图片缩放:如果需要调整图片大小,可以使用`getScaledInstance()`...

    Java图形水纹倒映效果_creativity

    1. **读取图像**:使用`ImageIO.read()`方法读取背景图像到内存中。 2. **创建倒影图像**:将原图像翻转垂直,形成倒影,这可以通过遍历图像像素并改变它们的Y坐标来完成。 3. **水纹效果**:模拟水波纹的动态效果,...

Global site tag (gtag.js) - Google Analytics