在存储器中表示图像数据的一个像素

时间:2013-10-28 12:24:50

标签: c++ graphics

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

有人请给我一些关于如何将RGBA信息存储在内存中以获得一个像素的图像数据的信息,是每个像素范围内一个像素的所有信息吗?

此外,我正在使用以下选项加载我的图像:

ifstream reader_;

...

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

...

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

3 个答案:

答案 0 :(得分:3)

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

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

如果你想要,你甚至可以“发明”一种像素格式......

答案 1 :(得分: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;

答案 2 :(得分:2)

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

每个uint32t内RGBA值的精确排列取决于文件格式。您可能在最低字节中找到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;     

或者,你可能不会;-)。字段打包的顺序还取决于运行代码的机器的“endianess” - 上面将介绍小端(例如Intel)架构。