Всю жизнь работал с 8 битными изображениями в PNG. Запись - чтение на основе бибилотеки PNG и примеров для 8 бит. Потребовалось работать с 16 битами.
Примера в сети не нашел и просто модифицировал старый код через байтовый хип, в результате запись в какой-то мере работает.
Более или менее работающий код записи в файл PNG. (Посоветуйте теги, чтобы код выглядел, как в среде компиляции и отладки)
Код:
// allocate a vector of row pointers
unsigned char * hip = new unsigned char [height*width*2];
std::vector<unsigned char *> rowPtrs;
rowPtrs.resize(height);
for (int y = 0; y<height; y++) rowPtrs[y] = &hip[y*width*2];
for (int y = 0; y < height; y++)
for (int x = 0; x < width; x++)
{
unsigned short vl = img.Pixel(x, y, 0);
hip[2*x + y*width*2] = (vl/256);
hip[2*x + 1 + y*width*2] = (vl%256);
}
// write the whole image
png_write_image(png_ptr, &rowPtrs[0]);
Но несмотря на
unsigned short Фотошоп считает, что первый бит вообще неинформационный. Но этот затык как бы не главный.
Вот код для чтения - формально читает, но не совсем то, что записано в файл. Скорее, совсем не то.
Код:
unsigned char* hip = new unsigned char[height * width * 2];
std::vector<unsigned char*> rowPtrs;
rowPtrs.resize(height);
for (int y = 0; y < height; y++) rowPtrs[y] = &hip[y * width * 2];
png_read_image(png_ptr, &rowPtrs[0]);
for (int y = 0; y < height; y++)
for (int x = 0; x < width; x++)
{
unsigned short vl = 256 * hip[2 * x + y * width * 2] + hip[2 * x + 1 + y * width * 2];
img.Pixel(x, y, 0) = vl;
}
С моей тчки зрения, я просто делаю обратную операцию, но на выхде все не то.