2012-11-15 1 views
2

J'utilise libtiff pour écrire une classe d'image qui charge et écrit des images tiff. Cependant, il est assez difficile de les utiliser, je continue à obtenir une erreur, mon code est:Problème lors de l'écriture d'une image avec libtiff en C++, débordement d'entier dans TIFFScanlineSize

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

et le message d'erreur est:

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

mon code d'appel est comme ceci:

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

Je peux écrire le fichier test_write.tiff, mais je ne peux pas l'ouvrir avec un explorateur d'images et la taille du fichier n'est pas la même que précédemment.

Merci

Répondre

5

Je pense que je viens de résoudre mon problème, puisque je ne peux pas trouver un problème similaire sur stackoverflow, peut-être que cela aidera les autres.

La raison est que TIFFSetField prend en valeur plutôt que la référence de la variable d'origine.

que tout fonctionne bien après le changement comme suit:

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

j'ai eu la pointe d'utiliser imagej pour ouvrir le fichier écrit, il montre que le fichier a échantillon erroné par pixel.

Questions connexes