从指定coords [x,y]的位图数据中获取像素颜色

时间:2015-05-27 13:30:02

标签: c++ image bitmap getpixel

我希望在栅格坐标上获得像素颜色,例如:

[0,0] - 第一行和第一列(左上角)的像素

[0,1] - 第一行和第二列中的像素,依此类推。

我正在加载我的位图:

BitsPerPixel = FileInfo[28];
width = FileInfo[18] + (FileInfo[19] << 8);
height = FileInfo[22] + (FileInfo[23] << 8);
int PixelsOffset = FileInfo[10] + (FileInfo[11] << 8);
int size = ((width * BitsPerPixel + 31) / 32) * 4 * height;
Pixels.resize(size);
hFile.seekg(PixelsOffset, ios::beg);
hFile.read(reinterpret_cast<char*>(Pixels.data()), size);
hFile.close();

和我的GetPixel功能:

void BITMAPLOADER::GetPixel(int x, int y, unsigned char* pixel_color)
{
    y = height - y;
    const int RowLength = 4 * ((width * BitsPerPixel + 31) / 32);
    pixel_color[0] = Pixels[RowLength * y * BitsPerPixel / 8 + x * BitsPerPixel / 8];
    pixel_color[1] = Pixels[RowLength * y * BitsPerPixel / 8 + x * BitsPerPixel / 8 + 1];
    pixel_color[2] = Pixels[RowLength * y * BitsPerPixel / 8 + x * BitsPerPixel / 8 + 2];
    pixel_color[3] = Pixels[RowLength * y * BitsPerPixel / 8 + x * BitsPerPixel / 8 + 3];
}

我知道位图中的数据是向上存储的,所以我想使用y = height - y;将其反转,但是使用此行我只得到一些甚至不在图像数据数组中的值。在不反转图像的情况下,我得到了阵列中的一些值,但它们从不与给定的坐标对应。我的位图可以是24位或32位。

1 个答案:

答案 0 :(得分:0)

对于位深度= 24,存储3个字节。填充不是每个像素完成,仅在每一行上完成:

const int bytesPerPixel = BitsPerPixel / 8;
const int align = 4;
const int RowLength = (width * bytesPerPixel + (align - 1)) & ~(align - 1);
...
pixel_color[0] = Pixels[RowLength * y + x * bytesPerPixel];
...