- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我在网上到处搜索,但找不到如何使用 Java 将 sRGB 或 Abobe (1998) 颜色配置文件添加到 Tiff 图像的解决方案。有一些 jpg 和 png 的示例,但它们不适用于 tiff。我一直在尝试使用 Commons Imaging 和 java.awt 来做到这一点,但没有任何运气。可能吗?
谢谢
更新:
我使用 TwelveMonkeys imageio-tiff 库和以下代码取得了一些进展:
File file = new File("/Users/user/Desktop/demo/sandal.tif");
BufferedImage image = ImageIO.read(file);
ICC_Profile ip = ICC_Profile.getInstance("/Users/user/Documents/icc/AdobeRGB1998.icc");
ICC_ColorSpace ics = new ICC_ColorSpace( ip );
ColorConvertOp cco = new ColorConvertOp( ics, null );
BufferedImage result = cco.filter(image, null);
ImageIO.write(result, "TIFF", new File("/Users/user/Desktop/demo/sandal2.tif"));
应用了颜色配置文件,但 tiff 被展平并删除了 alpha。如何保留 Alpha channel ?
最佳答案
正如评论中提到的,您的代码应该可以工作,除非您的 AdobeRGB1998 ICC 配置文件有什么特别之处...
下面的代码适用于我,将图像从 sRGB 转换为 AdobeRGB1998 配置文件。生成的 TIFF 文件具有正确的 ICC 配置文件,并包含完整的 Alpha channel (258/BitsPerSample: [8, 8, 8, 8]、277/SamplesPerPixels: 4、34675/ICCProfile: [...]
)。我能看到的唯一小问题是压缩从 LZW 更改为无压缩,DPI 从 300 更改为 72(+ XMP 元数据丢失)。
BufferedImage image = ImageIO.read(new File("C:\\Downloads\\sandal.tif"));
ICC_ColorSpace ics = (ICC_ColorSpace) ColorSpaces.getColorSpace(ColorSpaces.CS_ADOBE_RGB_1998);
ColorConvertOp cco = new ColorConvertOp(ics, null);
BufferedImage result = cco.filter(image, null);
File tempFile = File.createTempFile("test-", ".tif");
System.out.println("tempFile: " + tempFile); // Just to know where to look
ImageIO.write(result, "TIFF", tempFile);
如您所见,这里唯一真正的区别是 ICC 配置文件/色彩空间的获取方式。
如果您想保留元数据和/或控制压缩,这也是可能的。下面的代码基本相同(但保留了 LZW 压缩和 300dpi),不幸的是它有点冗长:
try (ImageInputStream input = ImageIO.createImageInputStream(new File("C:\\Downloads\\sandal.tif"))) {
ImageReader reader = ImageIO.getImageReaders(input).next();
reader.setInput(input);
IIOImage imageAndMeta = reader.readAll(0, reader.getDefaultReadParam());
reader.dispose();
ICC_ColorSpace ics = (ICC_ColorSpace) ColorSpaces.getColorSpace(ColorSpaces.CS_ADOBE_RGB_1998);
ColorConvertOp cco = new ColorConvertOp(ics, null);
BufferedImage result = cco.filter((BufferedImage) imageAndMeta.getRenderedImage(), null);
imageAndMeta.setRenderedImage(result);
File tempFile = File.createTempFile("test-", ".tif");
System.err.println("tempFile: " + tempFile);
ImageWriter tiffWriter = ImageIO.getImageWritersByFormatName("TIFF").next();
try (ImageOutputStream stream = ImageIO.createImageOutputStream(tempFile)) {
tiffWriter.setOutput(stream);
ImageWriteParam writeParam = tiffWriter.getDefaultWriteParam();
// If you want a specific compression, uncommment these lines
// The default setting is to copy from metadata
// writeParam.setCompressionMode(ImageWriteParam.MODE_EXPLICIT);
// Allowed compression type values are:
// "None", "CCITT RLE", "CCITT T.4", "CCITT T.6","LZW", "JPEG", "ZLib", "PackBits" and "Deflate"
// writeParam.setCompressionType("PackBits");
tiffWriter.write(null, imageAndMeta, writeParam);
}
tiffWriter.dispose();
}
(由于某种原因,XMP 元数据仍然从输出中删除,我认为这是一个错误)。
编写器目前不支持平铺,但将来可能由 writeParam
控制(使用标准 API 来实现)。您的原始图像没有平铺,所以我想这不是一个问题。
关于java - 使用 Java 添加 Tiff 图像颜色配置文件(sRGB 或 Adobe 1998),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39802563/
我正在为我的 pony detector 编写阴影去除功能。在我converted a PNG image from sRGB to CIE XYZ之后我删除了亮度as per instruction
我引用了以下 stackoverflow thread用于计算颜色校正矩阵。 如上述线程中所述,我想从 sRGB 颜色空间转换为线性 sRGB 空间,我正在尝试使用 pwkit colorspace
关闭。这个问题需要更多focused .它目前不接受答案。 想改进这个问题吗? 更新问题,使其只关注一个问题 editing this post . 关闭 4 年前。 Improve this qu
我正在尝试了解图像/视频处理的基础知识,最近我了解到所有处理都应应用于图像的线性表示。因此,我为 sRGB -> RGB 和 RGB -> sRGB 编写了两个函数: void sRGB2lRGB(s
您可能知道颜色在浏览器中的显示方式不同,无论是 CSS 还是某些图像。在做了一些研究之后,Sketch、Firefox 和 Chrome(我在 OSX Yosemite 上)似乎使用了 sRGB 配置
这样用Lookup table把颜色从0.0到1.0的线性空间转换成sRGB空间的0到255是个好办法吗? 例如,在 Java 中: byte[] table; void initializeTabl
我正在尝试在 NSView 中绘制内部阴影。阴影本身不是问题,但颜色设置让我发疯:/ #define ShadowBlurRadius 10.0 #define SRGB (CGFloat [4]){
在我的渲染器中,我在多重采样的 FBO 上生成抗锯齿场景,该场景被位 block 传输到颜色附件为纹理的 FBO。然后在渲染到帧缓冲区期间读取纹理。 我想更新它,以便获得 Gamma 正确的结果。使用
在 this question ,有人问如何以十六进制表示法获取图像的平均颜色。经过一番研究,我找到了一个使用 ImageMagick 的可行解决方案: user@laptop:~$ convert
我正在尝试将值从 转换为 srgb/linear。我有这个方程式,效果很好,但我无法在 wards 之后找回它: if(C 线性转换我想以某种方式使用它作为指导来获得我的类轮 > sRGB 转换..
在 OpenGL ES 中,我可以使用扩展名为 GL_EXT_sRGB 的 OpenGL ES 3.0 或 OpenGL ES 2.0 创建 sRGB 渲染缓冲区。我创建了一个内部格式为 GL_SRG
我想使用 ffmpeg 转换 的图像序列tiff 16bit rec709 到 的图像序列JPEG sRGB . # How would I indicate ffmpeg source is rec
我最近看到了这篇博文 Yet another post about gamma correction这教会了我 D3DPMISCCAPS_POSTBLENDSRGBCONVERT 的可用性能力标志。
我正在尝试将 RGB 转换为感知统一的色彩空间 CIELAB。维基百科指出: "The RGB or CMYK values first must be transformed to a specif
OpenGL 3.3 规范似乎没有要求在线性空间中完成 mipmap 生成。我所能找到的是以下内容: The internal formats of the derived mipmap arrays
如果我要为 iPhone 或 iPad 保存图像,是否应该在 Adobe Photoshop/Illustrator 中选择“转换为 sRGB”? Why You Should Probably
这是一个非常明确的问题,但我做了很多研究,但没有找到答案。 StackOverflow 问题为 this或this是关于 jpeg 转换的。 This是关于 python 内置库的。 那么,如何将 s
我有非线性 sRGB 格式的 iphone 照片。我需要线性 RGB。我无法在 opencv(python) 中找到将它们转换为线性 RGB 的方法。 还尝试了 ImageMagick 转换: con
我想知道 OpenCV 是否具有处理 sRGB 颜色空间中非线性的函数。 假设我想将 JPEG 图像从 sRGB 色彩空间转换为 XYZ 色彩空间。如本 Wiki page 中所述,首先需要取消非线性
如果使用 SRGB 纹理格式,我假设您只能在现代 GPU 的纹理读取中通过采样器免费获得 SRGB 转换是否正确? 因此,如果我想通过具有图像加载/存储功能的图像访问相同的 SRGB 纹理,我将不得不
我是一名优秀的程序员,十分优秀!