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

标签 c image format rgba

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

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

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

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

最佳答案

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

Wikipedia article关于 BMP 图像文件格式,有一个 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;
}

关于c - 存储未压缩 RGBA 图像数据的最简单格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43562758/

相关文章:

python - 如何将从 url 检索到的图像放入图像小部件

javascript - 使用语义 UI React 将 SVG 渲染为图像

zend-framework - Zend Framework,将 URL 的扩展名映射到格式参数?

c - C 中的位掩码 - 如何获取字节的第一位?

java - 分配空字符时会发生什么?

c - 什么是默认整数值?

javascript - 处理编程平均图像

c - 生成具有特定约束的随机位模式

jquery - 从 jquery 更改日期格式

c# - 将数字格式化为金钱