Я хочу получить пиксельный цвет для растровых координат, например:
[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-битным.
Для битовой глубины = 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];
...