шаблоны — ошибка при записи изображения с помощью libtiff в C ++, целочисленное переполнение в TIFFScanlineSize

Я использую libtiff для написания класса изображений, которые загружают и пишут tiff-изображения.
Тем не менее, их довольно сложно использовать, я получаю сообщение об ошибке, мой код:

  TIFF *out = TIFFOpen(filename.c_str(),"w") ;
if (out)
{
uint32 imagelength, imagewidth;
uint8 * buf;
uint32 row, col, n;
uint16 config, nsamples;
imagewidth = dims[0] ;
imagelength = dims[1] ;
config = PLANARCONFIG_CONTIG ;
nsamples = cn ;

TIFFSetField(out, TIFFTAG_IMAGELENGTH, &imagelength);
TIFFSetField(out, TIFFTAG_IMAGEWIDTH, &imagewidth);
TIFFSetField(out, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);
TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, &nsamples);
TIFFSetField(out, TIFFTAG_COMPRESSION, COMPRESSION_LZW) ;
TIFFSetField(out, TIFFTAG_BITSPERSAMPLE, 8) ;
TIFFSetField(out, TIFFTAG_ROWSPERSTRIP, TIFFDefaultStripSize(out, imagewidth*nsamples));

std::cout <<nsamples << std::endl ;

buf = new uint8 [imagewidth*nsamples] ;

for (row = 0; row < imagelength; row++){

for(col=0; col < imagewidth; col++){

for(n = 0 ; n < nsamples ; ++n)
{
Vec<T,cn>* temp = image_data[imagewidth*row+col] ;
buf[col*nsamples+n] = static_cast<uint8> ((*temp)[n]) ;
}
}
if (TIFFWriteScanline(out, buf, row) != 1 )
{
std::cout << "Unable to write a row." <<std::endl ;
break ;
}
}

_TIFFfree(buf);
TIFFClose(out);
} ...

и сообщение об ошибке:

test_write.tiff: Integer overflow in TIFFScanlineSize.
test_write.tiff: Integer overflow in TIFFScanlineSize.

мой код вызова такой:

Image<unsigned char,3> testimg ; //uint8 is unsigned char
testimg.read_image("test.tiff") ;
testimg.write_image("test_write.tiff") ;

Я могу написать test_write.tiff, но не могу открыть его ни одним из браузеров изображений, и размер файла не такой, как раньше.

Спасибо

2

Решение

Я думаю, что я только что решил свою собственную проблему, так как я не могу найти подобную проблему в стеке потока, может быть, это поможет другим.

Причина в том, что TIFFSetField принимает значение, а не ссылку на исходную переменную.

Так что все работает нормально после изменения следующим образом:

TIFFSetField(out, TIFFTAG_IMAGELENGTH, imagelength);
TIFFSetField(out, TIFFTAG_IMAGEWIDTH, imagewidth);
TIFFSetField(out, TIFFTAG_SAMPLESPERPIXEL, nsamples);

Я получил совет от использования imagej, чтобы открыть записанный файл, он показывает, что файл имеет неправильный образец на пиксель.

5

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]