将图像加载到RGBA数组中(C++)

3
有没有一种方法可以将图像加载到三维int数组中,每个像素都有RGBA数据? 例如像素在60,20处是黑色的,我希望数组在[60][20]处为0,0,0,100。

1
你的意思是这种语言中是否有标准函数或库来实现这个功能?如果是的话,答案是否定的。不过,有很多第三方库可以做到这一点。这里有一个:http://www.imagemagick.org/ - glampert
“image” 是什么格式? - Brandon
你的示例使用二维语法索引了一个三维数组。你的意思是想让 [60,20,0] 等于 0,[60,20,1] 等于 0,...,[60,20,3] 等于 100。 - jiggunjer
1个回答

1
我曾在处理视频时做过类似的事情,因为视频帧始终是640x480(NTSC)。

您可以将RGBA声明为结构:

struct rgba {
    unsigned char red;
    unsigned char green;
    unsigned char blue;
    unsigned char alpha;
};

然后你可以像这样声明你的数组:
rgba image[640][480];

(注:您可能希望颠倒高度和宽度,我会让您发现原因...)

负载变成了这样:

file.read(image, sizeof(image));

当然,这意味着文件数据格式正确:即原始RGBA以相同的“endian”等方式。但在大多数情况下,图像保存在磁盘上的方式并非如此。
正如glampert所提到的,其中一个库是ImageMagick。您也可以使用特定的JPEG、PNG、GIF87a加载器。但是,在所有这些情况下,您都不太可能能够直接将图像加载到数组中。您需要从某个图像对象缓冲区复制到您的数组中。
因此,假设您使用了一个给您提供对象的库,可能类似于这样:
Image img;
img.load(filename);
memcpy(image, img.data(), sizeof(image));

这是非常基础的代码,你应该测试load()函数是否正常工作,检查格式是否正确以及宽度x高度是否正确。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接