我无法理解在从文件加载后如何将标准TGA 32位图像排列在内存中。但我确实理解每个像素的字节数,但我不明白颜色分量(RGBA)是如何在内存中为一个像素布局的。换句话说,一个像素的字节如何排列在数组内。
有人请给我一些关于如何将RGBA信息存储在内存中以获得一个像素的图像数据的信息,是每个像素范围内一个像素的所有信息吗?
此外,我正在使用以下选项加载我的图像:
ifstream reader_;
...
reader_.open(path.c_str(), ios_base::in | ios::binary);
...
reader_.read((char*)(&_image.data[0]), size);
答案 0 :(得分:3)
在内存中,一切都变成了“位图”。这取决于您使用的像素格式。通常,RGB或RGBA(每通道8位/ 1字节)是最常见的,但您可以使用其他像素格式,例如:
如果你想要,你甚至可以“发明”一种像素格式......
答案 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)架构。