Мне нужно прочитать 16-битные изображения PNG в C ++ с libpng.
Я получил код, работающий на 8 бит, но я не могу найти решение, чтобы заставить его работать на 16 бит PNG.
Фрагмент кода для чтения 8 бит выглядит в основном так (принято из Вот):
png_byte color_type;
png_byte bit_depth;
png_bytep *row_pointers;
int rowbytes = png_get_rowbytes(png_ptr, info_ptr);
row_pointers = (png_bytep*)malloc(sizeof(png_bytep) * height);
for (int y = 0; y<height; y++)
row_pointers[y] = (png_byte*)malloc(png_get_rowbytes(png_ptr, info_ptr));
png_read_image(png_ptr, row_pointers);
Если я использую этот код, 16-битное изображение читается неправильно. Я думаю, что это происходит потому, что png_bytep
содержит только 8-битные значения.
Поэтому я попытался объявить указатели строк как png_uint_16
заменив png_bytep
с png_uint16p
, Фрагмент кода сверху будет выглядеть так:
png_byte color_type;
png_byte bit_depth;
png_uint_16p *row_pointers;
int rowbytes = png_get_rowbytes(png_ptr, info_ptr);
row_pointers = (png_uint_16p*)malloc(sizeof(png_uint_16p) * height);
for (int y = 0; y<height; y++)
row_pointers[y] = (png_uint_16*)malloc(png_get_rowbytes(png_ptr, info_ptr));
png_read_image(png_ptr, row_pointers);
Однако проблема в том, что функция png_read_image
требует png_bytep
в качестве ввода, который, насколько мне известно, только 8-разрядный. Но разве нет способа прочитать 16-битное изображение с помощью libpng?
Задача ещё не решена.
Других решений пока нет …