如何在不进行任何压缩的情况下保存16位图像(PNG或TIFF)?语法是什么?
最佳答案
两年后,OpenCV可以通过压缩(LZW)保存16位TIFF(2.4.x版本)。但它也支持函数中未记录的参数TIFFTAG_COMPRESSIONbool 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来源后,我发现了两种克服此限制的方法:
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
的参数)。