我无法理解标准TGA 32位图像从文件加载后如何在内存中排列。但是,我确实了解每像素字节数的概念,但我不了解颜色分量(RGBA)如何在内存中为一个像素布局。换句话说,一个像素的字节如何在数组内排列。
有人能给我一些关于RGBA信息如何存储在内存中一个像素图像数据的见解吗,一个像素的所有信息是否在每像素的字节范围内?
此外,我正在使用以下选项加载我的图像:
ifstream reader_;
。
reader_.open(path.c_str(), ios_base::in | ios::binary);
。
reader_.read((char*)(&_image.data[0]), size);
另一种方法,在我看来比提取数据更好,是使用强制转换。
使用运算符和位算术有其成本,将编译器转换为正确的格式是免费的。
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;
在内存中,一切都变成了"位图"。这取决于您使用的像素格式。通常,RGB 或 RGBA(每通道 8 位/1 字节)是最常见的,但您可以使用其他像素格式,例如:
- 颜色小于 32 位的位图,例如:对于 8 位,每个像素只有 256 种可能的颜色。 每个通道具有
- 不同位的位图,例如"每个通道"16 位,因此颜色信息具有更高的精度。
- 具有不同通道顺序的格式:ARGB、ABGR、BGR 等格式
- 单色(每像素 1 位)...所以在这种情况下,1 字节最多可以有 8 个像素!
如果你愿意,你甚至可以"发明"一种像素格式......
如果将缓冲区视为类型 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;
或者,您可能不会;-)。 字段的打包顺序还取决于运行代码的机器的"字节序" - 以上适用于小端(例如英特尔)架构。