Кажется, я не могу получить libpng для выгрузки своих данных в мою структуру. Я не могу понять, что я делаю не так. Я пытаюсь перевернуть байты, потому что PNG хранятся сверху вниз и мне нужны данные снизу вверх.
Сначала моя структура выглядит так:
typedef union RGB
{
uint32_t Color;
struct
{
unsigned char B, G, R, A;
} RGBA;
} *PRGB;
Затем я создал вектор как таковой:
png_init_io(PngPointer, hFile);
png_set_sig_bytes(PngPointer, 8);
png_read_info(PngPointer, InfoPointer);
uint32_t width, height;
int bitdepth, colortype, interlacetype, channels;
png_set_strip_16(PngPointer);
channels = png_get_channels(PngPointer, InfoPointer);
png_get_IHDR(PngPointer, InfoPointer, &width, &height, &bitdepth, &colortype, &interlacetype, nullptr, nullptr);uint32_t RowBytes = png_get_rowbytes(PngPointer, InfoPointer);
unsigned char** RowPointers = png_get_rows(PngPointer, InfoPointer);
std::vector<RGB> Pixels(RowBytes * height); //Amount of bytes in one row * height of image.
//Crashes in the for loop below :S
for (int I = 0; I < height; I++)
{
for (int J = 0; J < width; J++)
{
Pixels[(height - 1 - I) * width + J].RGBA.B = *(RowPointers[J]++);
Pixels[(height - 1 - I) * width + J].RGBA.G = *(RowPointers[J]++);
Pixels[(height - 1 - I) * width + J].RGBA.R = *(RowPointers[J]++);
}
}
std::fclose(hFile);
png_destroy_read_struct(&PngPointer, &InfoPointer, nullptr);
Что я сделал не так? Как я могу получить пиксели PNG и сохранить их вверх ногами? Я использовал ту же технику для растровых изображений, но PNG просто не работает: l
Не должно ли это:
Pixels[(height - 1 - I) * width + J].RGBA.B = *(RowPointers[J]++);
Индекс RowPointers
с помощью I
вместо?
Других решений пока нет …