0

从文件加载后,我无法理解标准 TGA 32 位图像在内存中的排列方式。然而,我确实理解每像素字节数的概念,但我不明白颜色分量(RGBA)如何在内存中为一个像素布置。换句话说,一个像素的字节如何在数组中排列。

有人能给我一些关于RGBA信息如何存储在一个像素图像数据的内存中的见解,一个像素的所有信息是否都在每个像素范围内的字节范围内?

我也正在使用这些选项加载我的图像:

ifstream reader_;

...

reader_.open(path.c_str(), ios_base::in | ios::binary);

...

reader_.read((char*)(&_image.data[0]), size);

4

3 回答 3

3

在内存中,一切都变成了“位图”。这取决于您使用的像素格式。通常,RGB 或 RGBA(每个通道 8 位/1 字节)是最常见的,但您可以使用其他像素格式,例如:

  • 少于 32 位颜色的位图,例如:对于 8 位,每个像素只有 256 种可能的颜色。
  • 每个通道具有不同位的位图,例如“每个通道”16 位,因此您对颜色信息有更高的精度。
  • 具有不同通道顺序的格式:ARGB、ABGR、BGR 等格式
  • 单色(每像素 1 位)......所以在这种情况下,1 个字节最多可以有 8 个像素!

如果您愿意,您甚至可以“发明”一种像素格式……

于 2013-10-28T12:30:15.197 回答
3

另一种在我看来比提取数据更好的方法是使用演员表。
使用运算符和位算术有其成本,使编译器转换为正确的格式是免费的。

struct RGBA
{
   uint8t r;
   uint8t g;
   uint8t b;
   uint8t a;
}

char* myBitmap = GetBitMapPointer();
RGBA* rgbaPointer = reinterpert_cast<RGBA*>(myBitmap);

//use pointer arithmetic from now on....
uint8t myFirstAvalue = rgbaPointer->a;

//second pixel
rgbaPointer++;
uint8t mySecondAvalue = rgbaPointer->a;
于 2013-10-28T12:36:16.377 回答
2

如果您将缓冲区视为类型,uint32t *则每个像素将占用缓冲区的一个元素。

每个中 RGBA 值的精确排列uint32t将取决于文件格式。您可能会R最低字节和A最高字节中找到:

uint8t r = (*p >>  0) & 0xff;       // cast as required
uint8t g = (*p >>  8) & 0xff;     
uint8t b = (*p >> 16) & 0xff;    
uint8t a = (*p >> 24) & 0xff;     

或者,您可能不会;-)。字段的打包顺序还取决于运行代码的机器的“字节顺序”——上面的内容适用于小字节序(例如英特尔)架构。

于 2013-10-28T12:29:39.130 回答