2010-08-16 20 views
0

TIFFWriteScanline fonctionne sous Windows et Linux, mais échoue sur Macne peut pas écrire des fichiers TIFF à l'aide LibTIFF sur Mac

question Mise à jour:

J'utilise libtiff3.9.4 pour lire et écrire des fichiers TIFF dans C++ sur mac 10.6.4. Mon projet est écrit pour être portable et fonctionne sans aucun problème sur Windows 32 bits et Ubuntu 64 bits. Mais sur le mac la fonction Libtiff TIFFWriteScanline échoue toujours (elle renvoie! = 1). Le fichier TIFF est créé, mais il n'a aucun contenu. Je suis capable de lire les images compressées LZW mais je ne suis pas capable de l'écrire. En outre, le programme fonctionne également pour les images CCITT Group4 sur Windows et Linux, mais lire scanline échoue sur le mac.

J'ai essayé à la fois libtiff3.8.2 et libtiff4.0.0beta6 sans aucune chance.

Des idées pour lesquelles libtiff n'écrira pas scanlines sur le mac quand il fonctionne bien sur linux?

code:

// set baseline tags 
TIFFSetField(tiffImage, TIFFTAG_IMAGEWIDTH, 7368); 
TIFFSetField(tiffImage, TIFFTAG_IMAGELENGTH, 4757); 
TIFFSetField(tiffImage, TIFFTAG_BITSPERSAMPLE, 8); 
TIFFSetField(tiffImage, TIFFTAG_SAMPLESPERPIXEL, 1); 
TIFFSetField(tiffImage, TIFFTAG_ORIENTATION, ORIENTATION_TOPLEFT); 
TIFFSetField(tiffImage, TIFFTAG_COMPRESSION, COMPRESSION_LZW); 
TIFFSetField(tiffImage, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISBLACK); 
TIFFSetField(tiffImage, TIFFTAG_THRESHHOLDING, 1); 
TIFFSetField(tiffImage, TIFFTAG_XRESOLUTION, 400; 
TIFFSetField(tiffImage, TIFFTAG_YRESOLUTION, 400); 
TIFFSetField(tiffImage, TIFFTAG_RESOLUTIONUNIT, 2); 

uint32 rowsPerStrip; 
rowsPerStrip = tiffData->height; 
rowsPerStrip = TIFFDefaultStripSize(tiffImage, rowsPerStrip); 
TIFFSetField(tiffImage, TIFFTAG_ROWSPERSTRIP, rowsPerStrip); 
TIFFSetupStrips(tiffImage); 

// row buffer 
scanlineSize = TIFFScanlineSize(tiffImage); 
scanline = (unsigned char*) _TIFFmalloc(scanlineSize); 

// write image 
for (int i = 0; i < iplImage->height; i++) 
{ 
    memcpy(scanline, iplImage->imageData + iplImage->widthStep*i, scanlineSize); 
    if(TIFFWriteScanline(tiffImage, scanline, i, 0) != 1){ 
     //Error 
    } 
} 

// clean up 
_TIFFfree(scanline); 
+0

Pourriez-vous poster votre code afin que nous ne devions pas le code à partir de zéro pour voir le problème? – Yuji

Répondre

1

je me suis déplacé cette question à la liste de diffusion LibTIFF il y a longtemps, mais j'ai oublié de donner la réponse ici, donc la voici:

J'inséré printf et modifié certains messages TiffError dans le code LibTIFF , et il s'est avéré que ces changements ne montraient nulle part quand mon programme a échoué. Après la recherche de quelques heures, j'ai trouvé que la bibliothèque Libtiff intégré dans OpenCV (libhighgui.dylib) a été la cause de mon mal de tête . Je sais qu'OpenCV utilise Libtiff mais je n'utilise pas la version intégrée car elle ne fournit pas toutes les fonctionnalités de Libtiff. I réinstallé OpenCV2.1.0 sans Libtiff et il a résolu le problème (il pourrait tout simplement avoir été l'ordre des dépendances incluses qui était causant des problèmes).

Je suis maintenant capable d'écrire des images compressées LWZ. Pour plus de détails, voir la liste de diffusion LibTiff.

1

Il est difficile de dire avec les informations que vous avez donné, mais ma meilleure estimation est que vous avez compilé libtiff sans support pour le format de sortie particulier que vous utilisez. En outre, si TIFFWriteScanline renvoie -1, un message d'erreur doit s'afficher à moins que vous ayez substitué votre propre gestionnaire d'erreurs. Cela devrait être un indice utile quant à ce qui se passe.