Не удается записать файлы TIFF с помощью Libtiff на Mac

TIFFWriteScanline работает в Windows и Linux, но не работает на Mac

Обновленный вопрос:

Я использую libtiff3.9.4 для чтения и записи файлов TIFF на C ++ на Mac 10.6.4. Мой проект написан для переносимости и работает без каких-либо проблем как на 32-разрядной версии Windows, так и на 64-разрядной версии Ubuntu. Но на Mac функция Libtiff TIFFWriteScanline всегда дает сбой (возвращает! = 1). Файл TIFF создан, но у него нет содержимого. Я могу читать сжатые изображения LZW, но не могу их записать. Кроме того, программа также работает с изображениями CCITT Group4 в Windows и Linux, но прочитать строку сканирования на Mac не удается.

Я безуспешно пробовал как libtiff3.8.2, так и libtiff4.0.0beta6.

Есть идеи, почему libtiff не будет писать строки развертки на Mac, когда он отлично работает в Linux?

Код:

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

person molholm    schedule 16.08.2010    source источник
comment
Не могли бы вы опубликовать свой код, чтобы нам не пришлось кодировать его с нуля, чтобы увидеть проблему?   -  person Yuji    schedule 17.08.2010


Ответы (2)


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

Кроме того, если TIFFWriteScanline возвращает -1, должно появиться сообщение об ошибке, если вы не заменили свой собственный обработчик ошибок. Это должно быть полезным ключом к пониманию того, что происходит.

person ergosys    schedule 17.04.2011

Я давно переместил этот вопрос в список рассылки LibTiff, но забыл дать здесь ответ, так что вот он:

Я вставил printf и изменил некоторые сообщения TiffError в коде Libtiff, и оказалось, что эти изменения нигде не отображаются, когда моя программа терпит неудачу. После нескольких часов поиска я обнаружил, что встроенная библиотека Libtiff в OpenCV (libhighgui.dylib) была причиной моей головной боли. Я знаю, что OpenCV использует Libtiff, но я не использую встроенную версию, поскольку она не обеспечивает полную функциональность Libtiff. Я переустановил OpenCV2.1.0 без Libtiff, и проблема была решена (возможно, проблема была связана с порядком включенных зависимостей).

Теперь я могу писать сжатые изображения LWZ. Для получения дополнительной информации см. Список рассылки LibTiff.

person molholm    schedule 07.08.2012