存储未压缩 RGBA 图像数据的最简单格式

Izh*_*ido 5 c format image rgba

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

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

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

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

Izh*_*ido 5

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

在有关BMP图像文件格式的维基百科文章中,有一个 4x2 ARGB 图像的示例,其中清楚地解释了其所有字段。

谢谢@Weather Vane的提示。

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

以下是我用来生成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;
}
Run Code Online (Sandbox Code Playgroud)