gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 23:19:50 25 4
gpt4 key购买 nike

我目前正在创建一个软件工具,该工具可为每个像素生成包含独立 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com