如何在不进行任何压缩的情况下保存16位图像(PNG或TIFF)?语法是什么?

最佳答案

两年后,OpenCV可以通过压缩(LZW)保存16位TIFF(2.4.x版本)。但它也支持函数中未记录的参数TIFFTAG_COMPRESSION
bool imwrite(const string& filename, InputArray img, const vector<int>& params=vector<int>() )
例如,可以将其设置为COMPRESSION_LZMA(并且可以正常工作)。

您可以将COMPRESSION_NONE用作此参数的值(也必须将TIFFTAG_ROWSPERSTRIP参数设置为图像高度)。

但是即使在2.4.9版本中,OpenCV在这种情况下仍会生成不正确的TIFF(试图将TIFFTAG_COMPRESSION设置为COMPRESSION_NONE)。

查看OpenCV来源后,我发现了两种克服此限制的方法:

  • 使用“opencv/modules/imgcodecs/src/grfmt_tiff.cpp”中的更改重新编译OpenCV-来自OpenCV的人员添加了用于压缩的参数,但忘记了以下事实:如果我们不想压缩,libtiff无法在TIFF句柄中设置预测变量。 。您应该找到此代码
    if ( !TIFFSetField(pTiffHandle, TIFFTAG_IMAGEWIDTH, width) || !TIFFSetField(pTiffHandle, TIFFTAG_IMAGELENGTH, height) || !TIFFSetField(pTiffHandle, TIFFTAG_BITSPERSAMPLE, bitsPerChannel) || !TIFFSetField(pTiffHandle, TIFFTAG_COMPRESSION, compression) || !TIFFSetField(pTiffHandle, TIFFTAG_PHOTOMETRIC, colorspace) || !TIFFSetField(pTiffHandle, TIFFTAG_SAMPLESPERPIXEL, channels) || !TIFFSetField(pTiffHandle, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG) || !TIFFSetField(pTiffHandle, TIFFTAG_ROWSPERSTRIP, rowsPerStrip) || !TIFFSetField(pTiffHandle, TIFFTAG_PREDICTOR, predictor) ){ TIFFClose(pTiffHandle); return false;}
    并将其更改为
    if ( !TIFFSetField(pTiffHandle, TIFFTAG_IMAGEWIDTH, width) || !TIFFSetField(pTiffHandle, TIFFTAG_IMAGELENGTH, height) || !TIFFSetField(pTiffHandle, TIFFTAG_BITSPERSAMPLE, bitsPerChannel) || !TIFFSetField(pTiffHandle, TIFFTAG_COMPRESSION, compression) || !TIFFSetField(pTiffHandle, TIFFTAG_PHOTOMETRIC, colorspace) || !TIFFSetField(pTiffHandle, TIFFTAG_SAMPLESPERPIXEL, channels) || !TIFFSetField(pTiffHandle, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG) || !TIFFSetField(pTiffHandle, TIFFTAG_ROWSPERSTRIP, rowsPerStrip) ){ TIFFClose(pTiffHandle); return false;}if (compression != COMPRESSION_NONE && !TIFFSetField(pTiffHandle, TIFFTAG_PREDICTOR, predictor) ){ TIFFClose(pTiffHandle); return false;}
    之后,OpenCV可以保存压缩和未压缩的TIFF(取决于imwrite的参数)。
  • 另一种方法是在应用程序中直接使用libtiff来保存TIFF。当然,在这种情况下,您需要实现书写功能。对于Windows,您应该编译libtiff,但这是一个相当简单的任务(libtiff包含许多编译器的makefile,并且可以在MinGW和MSVC(32位和64位)中完美地编译)。
  • 10-01 10:59