1

我正在从相机捕捉图像,我有两个功能可以保存 16 位(!)图像,一个是 PNG 格式,一个是 TIFF 格式。你能解释一下为什么PNG是一个非常嘈杂的图像吗?像这样:

PNG功能:

 bool save_image_png(const char *file_name,const mono16bit& img)
{
    [...]
        /* write header */
        if (setjmp(png_jmpbuf(png_ptr)))
                abort_("[write_png_file] Error during writing header");

        png_set_IHDR(png_ptr, info_ptr, width, height,
                     bit_depth,PNG_COLOR_TYPE_GRAY , PNG_INTERLACE_NONE,
                     PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE);

        png_write_info(png_ptr, info_ptr);



        /* write bytes */
        if (setjmp(png_jmpbuf(png_ptr)))
                abort_("[write_png_file] Error during writing bytes");

    row_pointers = (png_bytep*) malloc(sizeof(png_bytep) * height);

        for (y=0; y<height; y++)
            row_pointers[y] = (png_byte*) malloc(png_get_rowbytes(png_ptr,info_ptr));
     for (y = 0; y < height; y++)
     {
             row_pointers[y] = (png_bytep)img.getBuffer() + y * width*2;
     }



        png_write_image(png_ptr, row_pointers);


        /* end write */

  [...]           

}

和 TIFF 功能:

 bool save_image(const char *fname,const mono16bit& img)
{
  [...]

  for(y=0; y<height; y++) {
    if((err=TIFFWriteScanline(tif,(tdata_t)(img.getBuffer()+width*y),y,0))==-1)
      break;
  }

  TIFFClose(tif);

  if(err==-1) {
    fprintf(stderr,"Error writing to %s file\n",fname);
    return false;
  }
  return true;

//#endif //USE_LIBTIFF
}

谢谢!

4

2 回答 2

1

png_set_swap什么也没做。您必须实际翻转图像每个像素中的字节。

如果您在 PC 上并且拥有 SSSE3 或更新版本,一个好方法是_mm_shuffle_epi8指令,使用_mm_setr_epi8.

如果您在 ARM 上并且有 NEON,请改用vrev16q_u8指令。

于 2021-09-27T17:30:22.100 回答
0

也许你有一个字节顺序问题。尝试添加:

png_set_swap(png_ptr);

在保存图像之前

于 2012-05-23T20:53:52.700 回答