libpng неправильно пишет 16-битный RGB png, смещая все изображение влево - PullRequest
0 голосов
/ 01 апреля 2020

Я пытаюсь написать 16-битное RGB-изображение, используя libpng на c ++. Я сделал следующее

 .....
 FILE* fp = fopen(path, "wb");
 png_ptr = png_create_write_struct(PNG_LIBPNG_VER_STRING, nullptr, nullptr, nullptr);
 info_ptr = png_create_info_struct(png_ptr);
 png_init_io(png_ptr, fp);

 png_set_IHDR( png_ptr,
  info_ptr,
  width,
  height,
  16,
  PNG_COLOR_TYPE_RGB,
  PNG_INTERLACE_NONE,
  PNG_COMPRESSION_TYPE_BASE,
  PNG_FILTER_TYPE_BASE);

  png_write_info(png_ptr, info_ptr);
  png_set_swap(png_ptr);
  bytep row = (png_bytep)malloc(6 * width * sizeof(png_byte));
  for(int y = 0; y < height; y++){
   for(int x = 0; x <width; x++){
      set_rgb(&(row[x * 3]), array[y]);
   }
     png_write_row(png_ptr, row);
  }
  .....

, где массив является конгломератными значениями с плавающей точкой RGB, и set_rgb() Я делаю

void set_normal_rgb(png_byte* ptr, and array...) {

  ptr[0] = array[0];
  ptr[1] = array[1];
  ptr[2] = array[2];
}

Однако, изображение будет выглядеть примерно так

полученное изображение Где все правильное изображение сдавлено до левой половины, а правая половина - просто какой-то случайный шум. Я знаю, что я не назначаю пиксели правильно, и что каждый пиксель должен быть 6 байтов. Пробовал читать API, но все еще не ясно, как правильно назначить отдельные пиксели в 16-битном RGB-изображении.

Заранее спасибо.

...