TIFFOpen всегда возвращает NULL в ios - PullRequest
0 голосов
/ 13 февраля 2012

Я пытаюсь создать изображение TIFF, используя Libtiff.Я не мог понять причину, по которой файл не может быть открыт.Кто-нибудь есть какие-либо идеи ??

TIFF *image;
// Open the TIFF file
if((image = TIFFOpen("output.tif", "w")) == NULL){
    printf("Could not open output.tif for writing\n");
}

Редактировать 1

#include <stdio.h>
#include <tiffio.h>

int main(int argc, char *argv[]){
// Define an image
char buffer[25 * 144] = { /* boring hex omitted */ };
TIFF *image;

// Open the TIFF file
if((image = TIFFOpen("output.tif", "w")) == NULL){
  printf("Could not open output.tif for writing\n");
exit(42);
}

// We need to set some values for basic tags before we can add any data
TIFFSetField(image, TIFFTAG_IMAGEWIDTH, 25 * 8);
TIFFSetField(image, TIFFTAG_IMAGELENGTH, 144);
TIFFSetField(image, TIFFTAG_BITSPERSAMPLE, 1);
TIFFSetField(image, TIFFTAG_SAMPLESPERPIXEL, 1);
TIFFSetField(image, TIFFTAG_ROWSPERSTRIP, 144);

TIFFSetField(image, TIFFTAG_COMPRESSION, COMPRESSION_CCITTFAX4);
TIFFSetField(image, TIFFTAG_PHOTOMETRIC, PHOTOMETRIC_MINISWHITE);
TIFFSetField(image, TIFFTAG_FILLORDER, FILLORDER_MSB2LSB);
TIFFSetField(image, TIFFTAG_PLANARCONFIG, PLANARCONFIG_CONTIG);

TIFFSetField(image, TIFFTAG_XRESOLUTION, 150.0);
TIFFSetField(image, TIFFTAG_YRESOLUTION, 150.0);
TIFFSetField(image, TIFFTAG_RESOLUTIONUNIT, RESUNIT_INCH);

// Write the information to the file
TIFFWriteEncodedStrip(image, 0, buffer, 25 * 144);

// Close the file
TIFFClose(image);
}

Любая помощь будет оценена.Спасибо

Ответы [ 2 ]

1 голос
/ 15 февраля 2012

Вам НЕОБХОДИМО полный путь для доступа к файлам в удивительно ограниченной файловой системе iOS. Вы можете только читать и записывать файлы в частные каталоги вашего приложения. Каждое приложение имеет уникальную область в файловой системе. Имя каталога приложения представляет собой длинный набор букв и цифр, которые можно запросить с помощью getenv (). Вот версия C:

TIFF *image;
char szFileName[512];

   strcpy(szFileName, getenv("HOME"));
   strcat(szFileName, "/Documents/");
   strcat(szFileName, "output.tif");
   // Open the TIFF file
   if((image = TIFFOpen(szFileName, "w")) == NULL)
   {
      printf("Could not open output.tif for writing\n");
   }

Обновление: Поскольку у этого метода могут быть проблемы с долговременной совместимостью, другой вариант - использовать argv [0] (полный путь к вашему исполняемому файлу), обрезать имя листа и изменить его. указать на каталог документов.

1 голос
/ 13 февраля 2012

Вам нужен полный путь к файлу.Файлы обычно записываются в каталог документов приложений.

Ниже описано, как получить путь к каталогу документов для файла с именем output.tif, включая получение строкового представления "c":

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"output.tif"];
const char* cPath = [filePath cStringUsingEncoding:NSMacOSRomanStringEncoding];

NSLog (@ "cPath% s", cPath);NSLog вывод:

cPath /Volumes/User/dgrassi/Library/Application Support/iPhone Simulator/5.0/Applications/D483A43F-E8DD-4C80-81CF-E2F0CDF3EF49/Documents/output.tif
...