【问题标题】:Simplest format to store uncompressed RGBA image data存储未压缩 RGBA 图像数据的最简单格式
【发布时间】:2017-09-19 15:21:14
【问题描述】:

我目前正在创建一个软件工具,该工具生成的图像包含每个像素的独立 RGBA 信息——这意味着红色、绿色、蓝色和 alpha 分量应该被读取并视为单独的实体在单个像素中(即没有 alpha 预乘或任何其他数据组合技巧)。

这些图像必须存储在磁盘上。其目的是以一种方式存储它们,以便以后可以通过一个简单的 C 程序一次读取一个像素来轻松读取图像的各个像素。另一个要求是至少一个操作系统工具(MacOS 的预览、Windows 的画图、网络浏览器或任何其他用于在计算机中查看图像的常用工具)都可以看到存储的图像本身。

我可以用来存储上述数据的最简单的图像文件格式是什么?我找到的最接近的是 TIFF;但是,规范要求 RGBA 值的 alpha 预乘。您还知道哪些其他格式可以让我以未压缩的 RGBA 纯格式存储图像数据?

需要明确的是,文件大小不是问题。像素中组件的顺序也不是问题;对于本项目的所有实际用途,BGRA 与 RGBA 一样有效。

【问题讨论】:

  • BMP 格式呢? (注意,您需要注意将行存储长度设置为 4 个字节的倍数,必要时使用尾随填充,尽管如果您使用的是 RGBA 而不是 RGB,则无需担心)。
  • 我在维基百科和其他一些地方读过一些关于 BMP 的文章。我在规范中找不到允许我使用 Alpha 通道存储像素的内容 - 或者至少以其他软件工具认为有效的方式存储像素。如果你有一些关于它的信息,那将是非常受欢迎的!
  • Wikipedia page 表“Windows BITMAPINFOHEADER”中的一项表示每个像素的位数,即图像的颜色深度。典型值为 1、4、8、16、24 和 32,并且在下表中的“值 3”处提到了 RGBA,与其他地方一样。

标签: c image format rgba


【解决方案1】:

好的,回答我自己的问题。显然,答案是“我看起来不够努力”:D。

在关于 BMP 图像文件格式的Wikipedia article 中,有一个 4x2 ARGB 图像的示例,其所有字段都清楚地解释了。

谢谢@Weather Vane 的提示。

但是,我确实发现其中的数据存在问题。 MacOS 的预览版不喜欢具有特定格式的特定图像。我对文件进行了一些更改,并成功生成了一个 4x2 ARGB 位图,可以在 MacOS 和 Windows 上查看和使用。

以下是我用来生成BMP文件的代码,供以后参考:

#include <iostream>
#include <fstream>

unsigned char bmpData[] = // All values are little-endian
{
    0x42, 0x4D,             // Signature 'BM'
    0xaa, 0x00, 0x00, 0x00, // Size: 170 bytes
    0x00, 0x00,             // Unused
    0x00, 0x00,             // Unused
    0x8a, 0x00, 0x00, 0x00, // Offset to image data

    0x7c, 0x00, 0x00, 0x00, // DIB header size (124 bytes)
    0x04, 0x00, 0x00, 0x00, // Width (4px)
    0x02, 0x00, 0x00, 0x00, // Height (2px)
    0x01, 0x00,             // Planes (1)
    0x20, 0x00,             // Bits per pixel (32)
    0x03, 0x00, 0x00, 0x00, // Format (bitfield = use bitfields | no compression)
    0x20, 0x00, 0x00, 0x00, // Image raw size (32 bytes)
    0x13, 0x0B, 0x00, 0x00, // Horizontal print resolution (2835 = 72dpi * 39.3701)
    0x13, 0x0B, 0x00, 0x00, // Vertical print resolution (2835 = 72dpi * 39.3701)
    0x00, 0x00, 0x00, 0x00, // Colors in palette (none)
    0x00, 0x00, 0x00, 0x00, // Important colors (0 = all)
    0x00, 0x00, 0xFF, 0x00, // R bitmask (00FF0000)
    0x00, 0xFF, 0x00, 0x00, // G bitmask (0000FF00)
    0xFF, 0x00, 0x00, 0x00, // B bitmask (000000FF)
    0x00, 0x00, 0x00, 0xFF, // A bitmask (FF000000)
    0x42, 0x47, 0x52, 0x73, // sRGB color space
    0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, // Unused R, G, B entries for color space
    0x00, 0x00, 0x00, 0x00, // Unused Gamma X entry for color space
    0x00, 0x00, 0x00, 0x00, // Unused Gamma Y entry for color space
    0x00, 0x00, 0x00, 0x00, // Unused Gamma Z entry for color space

    0x00, 0x00, 0x00, 0x00, // Unknown
    0x00, 0x00, 0x00, 0x00, // Unknown
    0x00, 0x00, 0x00, 0x00, // Unknown
    0x00, 0x00, 0x00, 0x00, // Unknown

    // Image data:
    0xFF, 0x00, 0x00, 0x7F, // Bottom left pixel
    0x00, 0xFF, 0x00, 0x7F,
    0x00, 0x00, 0xFF, 0x7F,
    0xFF, 0xFF, 0xFF, 0x7F, // Bottom right pixel
    0xFF, 0x00, 0x00, 0xFF, // Top left pixel
    0x00, 0xFF, 0x00, 0xFF,
    0x00, 0x00, 0xFF, 0xFF,
    0xFF, 0xFF, 0xFF, 0xFF  // Top right pixel
};

int main(int argc, const char * argv[])
{
    std::fstream fs("test.bmp", std::ios_base::out | std::ios_base::binary);

    fs.write((const char *)bmpData, sizeof(bmpData));

    fs.close();

    std::cout << "The BMP has been written.\n";

    return 0;
}

【讨论】:

    【解决方案2】:

    我知道 RGBA BMP 已经回答了这个问题,但还有另一个选择:Netpbm 人员创建了一种新格式来扩展 PBM/PGM/PPM/PNM,它还可以存储 16 位深度和/或 Alpha 通道。

    它被称为便携式任意地图,并使用.pam 扩展名。它的功能类似于其他二进制 PNM 格式,除了它有一个 P7 魔术头编号和稍微扩展的头格式。例如,要创建一个 4px x 2px RGBA 图像,每个通道具有 8bpp,您可以使用以下标头:

    P7
    WIDTH 4
    HEIGHT 2
    DEPTH 4
    MAXVAL 255
    TUPLTYPE RGB_ALPHA
    ENDHDR
    

    ...然后是您的像素数据的平面转储。

    您可以在 Netpbm 页面查看更多详细信息:http://netpbm.sourceforge.net/doc/pam.html

    目前 .pam 并未得到广泛支持,因此它缺少您问题的一个关键部分(“必须使用内置操作系统工具查看”)。 XnView 和 FFmpeg 至少可以使用它。此外,Netpbm 库附带了一个 pamtopng 实用程序,它完全按照它在锡上所说的 - 甚至将 RG​​BA PAM 转换为带有 alpha 的 PNG。因此,如果您正在编写自己的工具,则可以将其视为一种交换格式。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-10-06
      • 2013-08-03
      • 1970-01-01
      • 2015-02-02
      • 1970-01-01
      • 2012-08-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多