【发布时间】:2011-09-06 23:03:03
【问题描述】:
关于带有 alpha 通道的 JPEG 是否有效,似乎存在一些争论。我一直认为正确的答案是that in the JPEG FAQ,本质上是“否”。 (在another question on Stack Overflow 中重申了这一点。)
然而,Sun 的 ImageIO 库中的 Java JPEGImageWriter 将愉快地使用 alpha 通道写入和读取灰度和 RGB 图像,尽管到目前为止我在 Linux 上几乎没有任何应用程序可以正确加载此类 JPEG。这在过去曾被报告为一个错误,但 Sun 的回应是 these are valid files:
这不是 Image I/O 错误,而是其他应用程序的缺陷 提交者提到。 IIO JPEGImageWriter 能够用 包含 Alpha 通道的颜色模型(在 IJG 原生中称为 源代码为“NIFTY”颜色空间,例如 RGBA、YCbCrA 等),但许多应用程序并不知道这些颜色空间。所以即使这些图像 由 IIO JPEG 编写器编写的符合 JPEG 规范(其中 对各种色彩空间的可能性视而不见),某些应用程序可能不会 识别包含 Alpha 通道并可能抛出 如提交者所述,错误或呈现损坏的图像。
希望与这些其他不知道 alpha 的开发人员保持兼容性 应用程序应该编写不包含 Alpha 通道的图像(例如 TYPE_INT_RGB)。想要写入/读取图像能力的开发人员 包含 JPEG 格式的 Alpha 通道可以使用 Image I/O 执行此操作 API,但需要注意的是,许多本地应用程序并不完全 符合 YCbCrA 和 RGBA 格式。
有关详细信息,请参阅图像 I/O JPEG 元数据格式规范和使用说明: http://java.sun.com/j2se/1.4.1/docs/api/javax/imageio/metadata/doc-files/jpeg_metadata.html
关闭为“不是错误”。 xxxxx@xxxxx 2003-03-24
我正在使用一个创建此类文件的 Java 应用程序,并希望编写一些 C 代码以尽可能快地加载这些文件。 (本质上问题在于 Java ImageIO 库在解压缩这些文件时非常慢,我们希望通过 JNI 用本机代码替换加载器以改善这一点 - 目前这是一个性能瓶颈。)
这里有一些示例文件 - 向 coulrophobic 的任何人道歉:
在这里您可以看到尝试使用我相信使用libjpeg 的各种 Linux 软件查看灰度+alpha 和 RGB+alpha 图像的结果:
(来源:mark at mythic-beasts.com)
因此,在每种情况下,颜色空间似乎都被误解了。 jpeglib.h 中唯一允许的值是:
/* Known color spaces. */
typedef enum {
JCS_UNKNOWN, /* error/unspecified */
JCS_GRAYSCALE, /* monochrome */
JCS_RGB, /* red/green/blue */
JCS_YCbCr, /* Y/Cb/Cr (also known as YUV) */
JCS_CMYK, /* C/M/Y/K */
JCS_YCCK /* Y/Cb/Cr/K */
} J_COLOR_SPACE;
...看起来不太乐观。
如果我使用libjpeg 的example.c 的略微修改版本加载这些图像,则读取标题后每个图像的cinfo.jpeg_color_space 和cinfo.out_color_space 的值如下:
gray-normal.jpg: jpeg_color_space is JCS_GRAYSCALE, out_color_space is JCS_GRAYSCALE
gray-alpha.jpg: jpeg_color_space is JCS_CMYK, out_color_space is JCS_CMYK
rgb-normal.jpg: jpeg_color_space is JCS_YCbCr, out_color_space is JCS_RGB
rgb-alpha.jpg: jpeg_color_space is JCS_CMYK, out_color_space is JCS_CMYK
所以,我的问题是:
- 是否可以使用 libjpeg 正确读取这些文件?
- 如果没有,我可以使用替代的 C 库来应对它们吗?
显然,对于更一般的问题,至少还有两种其他解决方案:
- 更改软件以输出普通 JPEG + 表示 Alpha 通道的 PNG 文件
- 以某种方式提高 Sun 的 ImageIO 的性能
...但是第一个会涉及很多代码更改,并且不清楚如何处理后者。无论如何,我认为如何使用libjpeg 加载此类文件的问题可能是更普遍的兴趣之一。
任何建议将不胜感激。
【问题讨论】:
标签: java jpeg file-format libjpeg color-space