Не могу записать файлы TIFF с помощью Libtiff на Mac - PullRequest
1 голос
/ 16 августа 2010

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

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

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

Ответы [ 2 ]

1 голос
/ 07 августа 2012

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

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

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

1 голос
/ 17 апреля 2011

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

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

...