cmyk与rgb的转换

合集下载
相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

使用ImageIO.read读取图片

最近碰到项目需要读取图片,然后将图片进行等比压缩,在公司环境测试时压缩图片没有问题,但是部署到客户环境,使用后发现很多图片没有被转换,一直纠结为什么,通过调试发现在

// 读取图片

BufferedImage image = (BufferedImage) ImageIO.read(new File(path+ fileName));

这段代码执行之后就不继续执行代码,原以为是代码写的有问题,但后来发现代码上没有问题,度娘搜索很久之后才发现原来是与图片色彩模式有关,在公司测试时使用的图片色彩模式大多为rgb的,但是客户真正使用的时候发现大多数图片都是cmyk格式的,ImageIO.read不支持读取cmyk色彩模式的图片,这个问题在网上搜索了下,可以通过以下代码来处理:

/*读取图片*/

public void readImage(String filename) throws IOException {

File file = new File(filename);

//创建输入流

ImageInputStream input = ImageIO.createImageInputStream(file);

Iterator readers = ImageIO.getImageReaders(input);

if (readers == null || !readers.hasNext()) {

throw new RuntimeException("No ImageReaders found");

}

ImageReader reader = (ImageReader) readers.next();

reader.setInput(input);

//获取文件格式

String format = reader.getFormatName();

BufferedImage image;

if ("JPEG".equalsIgnoreCase(format) || "JPG".equalsIgnoreCase(format)) {

try {

// 尝试读取图片(包括颜色的转换).

image = reader.read(0); // RGB

} catch (IIOException e) {

// 读取Raster (没有颜色的转换).

Raster raster = reader.readRaster(0, null);// CMYK

image = createJPEG4(raster);

}

image.getGraphics().drawImage(image, 0, 0, null);

//生成新的文件名

String newfilename = filename.substring(0, filename

.lastIndexOf("."))

+ "" + filename.substring(stIndexOf("."));

File newFile = new File(newfilename);

//创建输出流

FileOutputStream out = new FileOutputStream(newFile);

JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(out);

encoder.encode(image);

out.flush();

out.close();

}

}

private static BufferedImage createJPEG4(Raster raster) {

int w = raster.getWidth();

int h = raster.getHeight();

byte[] rgb = new byte[w * h * 3];

// 彩色空间转换

float[] Y = raster.getSamples(0, 0, w, h, 0, (float[]) null);

float[] Cb = raster.getSamples(0, 0, w, h, 1, (float[]) null);

float[] Cr = raster.getSamples(0, 0, w, h, 2, (float[]) null);

float[] K = raster.getSamples(0, 0, w, h, 3, (float[]) null);

for (inti = 0, imax = Y.length, base = 0; i

double val = y + 1.402 * (cr - 128) - k;

val = (val - 128) * .65f + 128;

rgb[base] = val< 0.0 ? (byte) 0 : val> 255.0 ? (byte) 0xff

: (byte) (val + 0.5);

val = y - 0.34414 * (cb - 128) - 0.71414 * (cr - 128) - k;

val = (val - 128) * .65f + 128;

rgb[base + 1] = val< 0.0 ? (byte) 0 : val> 255.0 ? (byte) 0xff : (byte) (val + 0.5);

val = y + 1.772 * (cb - 128) - k;

val = (val - 128) * .65f + 128;

rgb[base + 2] = val< 0.0 ? (byte) 0 : val> 255.0 ? (byte) 0xff : (byte) (val + 0.5);

}

raster = Raster.createInterleavedRaster(new DataBufferByte(rgb, rgb.length), w, h, w * 3, 3, new int[] { 0, 1, 2 }, null);

ColorSpacecs = ColorSpace.getInstance(ColorSpace.CS_sRGB);

ColorModel cm = new ComponentColorModel(cs, false, true,

Transparency.OPAQUE, DataBuffer.TYPE_BYTE);

return new BufferedImage(cm, (WritableRaster) raster, true, null);

}

以上代码是通过读取原有文件判断是否为rgb色彩模式,不为rgb色彩模式时创建新的图

相关文档
最新文档