mhs*_*mhs 5 jpeg image-processing
我正在做一些涉及使用 WIC 编码图像数据的编程。我使用了 RGB 数据,但 WIC 始终将其视为 BGR。我有一个关于 Stack Overflow处理编程方面的相关问题。但是,我想排除该问题可能与 WIC 或 JPEG 文件格式有关。
这是 JPEG 的正常行为,还是 WIC 如何处理图像数据?
这是根据 OP 在评论中提供的附加信息、SO 上的相关线程以及他自己的答案对我的答案的主要重写。
JPEG 文件格式是否支持 RGB 数据?
RGB有两个含义。
它是一个颜色空间,其中颜色是根据红色、绿色的原色定义的。和蓝色。JPEG 标准是以 RGB 色彩空间为起点的。出于压缩目的,它被转换为 YCbCr。这篇维基百科文章对编码和压缩过程进行了非常详尽的描述。
RGB 表示解释存储的颜色数据的顺序。Bob 的回答解释了为什么它也可以按 BGR 顺序进行解释。这就是导致导致这个问题的混乱的含义。它实际上与 JPEG 标准无关,而是与 WIC 处理数据的方式有关。
图像格式文件规范包括定义颜色序列。在这种情况下,情况并非如此。WIC 正在从原始图像数据创建 JPEG。根据您找到的链接,WIC 支持输入数据的 RGB 和 BGR 顺序,尽管它仅将 BGR 列为其原生 JPEG 编解码器的输入。因此,问题在于与 WIC 交互并为其提供预期的内容。
虽然可以控制 WIC 读取的实际数据格式,但请注意,设备无关位图格式通常用于未压缩的图像数据(也包含在大多数 BMP 文件中),将 24BPP 和 32BPP 格式的每个像素存储为单个 24 位或 32 位小端字。
这张图片很好地描述了 little-endian:
图片是公共领域,由RS Shaw 提供,来自Wikimedia Commons
如您所见,最低有效字节在前,最高有效字节在后。32BPP ARGB 值将作为单独的 8 位字节 B、G、R、A 存储在内存和磁盘上。 24BPP RGB 值也是如此,以 B、G、R 的形式存储在内存中。
这可能解释了为什么 WIC 使用的默认格式似乎是“BGR” - 因为这是默认的内存中表示,并且转换为大端 RGB 将是额外的工作,除非明确要求,否则不会完成。
顺便说一下,人类通常将数字读为大端;以相反的顺序。同一个 24BPP/32BPP 字的大端字节表示将读取为 RGB 或 ARGB,更接近您的预期。
| 归档时间: |
|
| 查看次数: |
4542 次 |
| 最近记录: |