我现在找到一个解决方案,这是工作,至少如果我的结果图像也是一个JPEG:
首先我读取图像(从字节数组imageData),最重要的是,我还读取元数据。
InputStream is = new BufferedInputStream(new ByteArrayInputStream(imageData));
Image src = null;
Iterator it = ImageIO.getImageReadersByMIMEType("image/jpeg");
ImageReader reader = it.next();
ImageInputStream iis = ImageIO.createImageInputStream(is);
reader.setInput(iis, false, false);
src = reader.read(0);
IIOMetadata imageMetadata = reader.getImageMetadata(0);
现在我要做一些转换(即缩小尺寸)…最后我将结果写回为JPEG图像。这里最重要的是将从原始图像获得的元数据传递给新的IIOImage。
Iterator iter = ImageIO.getImageWritersByMIMEType("image/jpeg");
ImageWriter writer = iter.next();
ImageWriteParam iwp = writer.getDefaultWriteParam();
iwp.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
iwp.setCompressionQuality(jpegQuality);
ImageOutputStream imgOut = new MemoryCacheImageOutputStream(out);
writer.setOutput(imgOut);
IIOImage image = new IIOImage(destImage, null, imageMetadata);
writer.write(null, image, iwp);
writer.dispose();
不幸的是,如果我写一个PNG图像,我仍然得到错误的颜色(即使传递元数据),但我可以忍受。