如何从PNG中删除Gamma信息
我试图生成没有伽玛信息的图像,以便IE8可以正确显示它们。使用以下代码,但结果是一个看起来与原始图像完全不同的扭曲图像。
///PNG
PNGEncodeParam params= PNGEncodeParam.getDefaultEncodeParam(outImage);
params.unsetGamma();
params.setChromaticity(DEFAULT_CHROMA);
params.setSRGBIntent(PNGEncodeParam.INTENT_ABSOLUTE);
ImageEncoder encoder= ImageCodec.createImageEncoder("PNG", response.getOutputStream(), params);
encoder.encode(outImage);
response.getOutputStream().close();
这是原始图像和上面代码产生的扭曲图像。
谢谢!
没有找到相关结果
已邀请:
2 个回复
捐焦
标识。 以下是从png图像中删除gAMA的原始方法:我们假设输入流是有效的PNG格式。首先读取8个字节,即png标识符
。然后读取另外25个字节,其中包含图像标题。我们总共从文件顶部读取了33个字节。现在将它们保存到另一个png扩展名的临时文件中。现在它来了一个while循环。我们逐个读取块:如果它不是IEND而且它不是gAMA块,我们将它复制到输出tempfile。如果它是gAMA主干,我们跳过它,直到我们到达IEND,它应该是最后一个块,然后我们将它复制到tempfile。完成。这是完整的测试代码,用于显示事情是如何完成的(它仅用于演示目的,未经优化):
由于输入是Java InputStream,我们可以使用某种编码器将图像编码为PNG并将其写入ByteArrayOutputStream,后者将作为ByteArrayInputSteam提供给上述测试类,并且伽玛信息(如果有的话)将被删除。结果如下: 左侧是带有gAMA的原始图像,右侧是移除了gAMA的相同图像。 图片来源:http://r6.ca/cs488/kosh.png 编辑:这是删除任何辅助块的代码的修订版本。
用法:
将删除任何预定义的14个辅助块。
只会删除png文件后指定的块。 注意:如果将文件夹名称指定为PNGChunkRemover的第一个参数,则将处理该文件夹中的所有png文件。 上面的示例已成为Java图像库的一部分,可以在https://github.com/dragon66/icafe找到
坊岔埠绵
包含在库样本中。