32-битное изображение TIF для чтения и записи с использованием библиотеки libtiff.(C ++) - PullRequest
0 голосов
/ 09 июня 2018

У меня проблема с чтением и сохранением 32-битного изображения с помощью библиотеки LibTIFF.

В моем коде у меня есть массив uint32s, представляющих значения пикселей изображения.

Когда я сохраняю эти значения в файл TIF, он выглядит хорошо.Тем не менее, когда я пытаюсь прочитать и сохранить его как один и тот же файл TIFF с помощью библиотеки LibTIFF, изображение имеет одно и то же переполненное значение (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 голосов
/ 09 июня 2018

Я исправил проблему.В отличие от того, что я первоначально ожидал, была проблема с частью чтения.Функция может считывать только одну строку видео пикселей за раз, и код был изменен с помощью.

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));


            }
...