背景

之前在PDF转JPG时使用了ImageMagic这个强大的工具,起初使用都没有什么问题,但是突然生产出现部分转换后的图片合并失败的问题

报错信息:

javax.imageio.IIOException: Unsupported Image Type
       at com.sun.imageio.plugins.jpeg.JPEGImageReader.readInternal(Unknown Source)
       at com.sun.imageio.plugins.jpeg.JPEGImageReader.read(Unknown Source)
       at javax.imageio.ImageIO.read(Unknown Source)
       at javax.imageio.ImageIO.read(Unknown Source)

产生原因

JPG是正儿八经的jpg,我们使用JAVA自带的IMAGE类库,网上查了一下这种情况是因为jpg的颜色模式是cymk,而jdk默认能处理的rgb颜色模式的图片

CYMK和RGB

刨去报错的内容,我们先来了解一下这两个颜色模式

RGB

RGB色彩模式是基于光源色发光原理定义,适用于显示器等发光体的颜色表示

以黑色介质为基础,通过光源三原色(红、绿、蓝)不同比例的亮度叠加,来获得各种不同的颜色,也就是所谓的相加色

CYMK

CMYK即CMY色彩模式是基于固有色光吸收/反射原理定义,适用于各种印刷媒介;

白光照射到物体上后,物体吸收掉其固有色的互补色光,从而反射光也就呈现为其固有色
以白色介质为基础,通过印刷三原色(青、品红、黄)不同比例的油墨混合,吸收原始色光中的对应波长,从而获得各种不同的颜色的反射效果,也就是所谓的相减色。

简而言之,RGB是颜色的叠加是相加色;CYMK是调节不通比例的油墨原色,是相减色

问题解决

网络上有一堆CYMK转RGB的代码,但是我们的图片是ImageMagick生成的,所以我们还是要通过指令参数解决,指令模板如下:

magick convert -density 220 -quality 80 -background white -alpha remove  -colorspace sRGB {0} {1}/1.jpg

-colorspace sRGB 指定颜色模式为rgb,搞定