使用libtiff库读写32位tif图像。 (C ++)

时间:2018-06-09 04:26:10

标签: c++ image libtiff

我在使用LibTIFF库读取和保存32位图像时遇到问题。

在我的代码中,我有一个uint32s数组,表示图像的像素值。

当我将这些值保存到tif文件时,它看起来很好。 但是,当我尝试使用LibTIFF库读取并将其保存为相同的TIFF文件时,图像在所有像素阵列上都具有相同的溢出值(842150464 ......它太大!!)。

作为调试的结果,图像读取部分似乎没有问题。 我认为写作部分是错误的,但我无法修复它。 (我尝试过TIFFWriteScanline和TIFFWriteEncodedStrip)

原始图像和书写图像(黑色像素)

//---------------reading part------------------
TIFF* tif = TIFFOpen(filepath.c_str(), "r");

TIFFGetField(tif, TIFFTAG_IMAGEWIDTH, &width);
TIFFGetField(tif, TIFFTAG_IMAGELENGTH, &height);
uint32* buffer = (uint32 *)malloc(width*height * sizeof(uint32));
TIFFReadRawStrip(tif, 0, buffer, width*height);

//---------------writing part------------------

TIFF *image = TIFFOpen("input.tif", "w");
TIFFSetField(image, TIFFTAG_IMAGEWIDTH, width); 
TIFFSetField(image, TIFFTAG_IMAGELENGTH, height); 
TIFFSetField(image, TIFFTAG_BITSPERSAMPLE, 32); 
TIFFSetField(image, TIFFTAG_SAMPLESPERPIXEL, 1); 
TIFFSetField(image, TIFFTAG_ROWSPERSTRIP, 1);   
TIFFSetField(image, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT);
TIFFSetField(image, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
TIFFSetField(image, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK);
TIFFSetField(image, TIFFTAG_SAMPLEFORMAT, SAMPLEFORMAT_UINT);
TIFFSetField(image, TIFFTAG_COMPRESSION, COMPRESSION_NONE);

scan_line = (uint32 *)malloc(width*(sizeof(uint32)));

for (int i = 0; i < height; i++) {

    memcpy(scan_line, &buffer[i*width], width * sizeof(uint32));
    TIFFWriteScanline(image, scan_line, i, 0);
}

TIFFClose(image);
TIFFClose(tif);
free(buffer);
free(scan_line);

1 个答案:

答案 0 :(得分:1)

我已经解决了这个问题。 与我原先预期的不同,阅读部分存在问题。该函数一次只能读取一行视频像素,并且代码被修改为。

for (int i = 0; i < height; i++) //loading the data into a buffer
            {
                TIFFReadScanline(tif, scan_line, i);
                memcpy(&buffer[i*width], scan_line, width * sizeof(uint32));


            }