上传做完了交由测试的时候,反馈说上传失败,自己试了试,都是成功的,于是叫测试人员把图片发给我看看。刚开始以为是图片太大了(2.9M,其实也没多大),我后来用一个3M的图片上传都上传成功了,仔细对比了图片的信息,发现失败的那张是CMYK的颜色样式,就想着转成RGB就完事了:
public class ReadJPEGRaster extends JFrame {
static String file = "C:\\Users\\ZhangAo\\Desktop\\example-cmyk.jpg";
public static void main(String[] args) throws Throwable {
// 找一个reader
Iterator readers = ImageIO.getImageReadersByFormatName("JPEG");
ImageReader reader = null;
while (readers.hasNext()) {
reader = (ImageReader) readers.next();
if (reader.canReadRaster()) {
break;
}
}
// 设置input.
ImageInputStream input = ImageIO.createImageInputStream(new File(file));
reader.setInput(input);
// 创建图片.
BufferedImage image;
try {
// 尝试读取图片 (包括颜色的转换).
image = reader.read(0);
} catch (IIOException e) {
// 读取Raster (没有颜色的转换).
Raster raster = reader.readRaster(0, null);
// 随意选择一个BufferedImage类型.
int imageType;
switch (raster.getNumBands()) {
case 1:
imageType = BufferedImage.TYPE_BYTE_GRAY;
break;
case 3:
imageType = BufferedImage.TYPE_3BYTE_BGR;
break;
case 4:
imageType = BufferedImage.TYPE_4BYTE_ABGR;
break;
default:
throw new UnsupportedOperationException();
}
// 创建一个BufferedImage.
image = new BufferedImage(raster.getWidth(), raster.getHeight(), imageType);
// 设置图片数据.
image.getRaster().setRect(raster);
}
// 显示图片.
new ReadJPEGRaster(image);
}
ReadJPEGRaster(RenderedImage image) {
super();
getContentPane().add(new com.sun.media.jai.widget.DisplayJAI(image));
pack();
show();
}
}
可惜无法做到无损转换...用ImageMagick的命令行工具倒是可以无损转换,还有据说使用了JNI的jmagick也可以.但是没有权限在服务器上安装..
如果哪位知道其他CMYK无损转RGB的方法(不需要安装其他工具),还请告知..Thank you in advance!