Как загрузить самодельный файл изображения TIFF из NSDocumentsDirectory

При попытке загрузить файлы из NSDocumentsDirectory iPhone, я не могу создать источник изображения со строкой пути, который у меня есть.

Я получаю сообщение об ошибке <Error>: ImageIO: CGImageSourceCreateWithURL CFURLCreateDataAndPropertiesFromResource failed with error code -15. ", который является kCFURLImproperArgumentsError,

Однако я не могу найти, какие "правильные" аргументы могут быть. Пример пути будет: /var/mobile/Applications/36D76BDF-72EC-4180-9246-CF1F50CF396C/Documents/2013080110555532Image.tiff "

На мой вопрос, как сохранить TIFF..., я теперь документирую, как записывать файлы в NSDocumentsDirectory, Еще раз спасибо за помощь, ребята.

Теперь я пытаюсь прочитать их снова. Я думал, что чтение было похоже на письмо, только зеркальное отражение.
Файлы ~20MB - ... хм,... каждый! - это тоже может быть проблемой...

Это фрагмент кода (спасибо Ganapathy за этот ответ), который на самом деле дает мне изображение для отображения:

if ([self pathLastRawDataSave])
{
    UIImage *anImage = [UIImage imageWithContentsOfFile:[self pathLastRawDataSave]];

    if (NULL != anImage)
    {
        [[self imageView] setImage:anImage];
    }
}

Тем не менее, это всегда сложнее, чем в небольшом примере, и мне также нужны метаданные (и эскиз изображения), поэтому я боюсь, что вернулся, чтобы сделать CGImageSource работа, в конце концов.

Эврика! Я нашел это! Недостающим звеном был метод fileURLWithPath ! Кроме того, я не кеширую, а также использую словарь опций создания для поиска изображений.

Это на самом деле работает:

if ([self pathLastRawDataSave])
{
    NSURL* imageFileURL = [NSURL fileURLWithPath:[self pathLastRawDataSave]];

    CFURLRef imageFileURLRef = (__bridge CFURLRef)imageFileURL; // bridged from NS-Object, no release!

    NSDictionary* sourceOptions = @{(id)kCGImageSourceShouldCache: (id)kCFBooleanFalse,
                                    (id)kCGImageSourceTypeIdentifierHint: (id)kUTTypeTIFF};

    CFDictionaryRef sourceOptionsRef = (__bridge CFDictionaryRef)sourceOptions; // bridged from NS-Object, no release!

    CGImageSourceRef imageSource = CGImageSourceCreateWithURL(imageFileURLRef, sourceOptionsRef);


    if (NULL != imageSource)
    {
        // create the image from the file
        CGImageRef imageData = CGImageSourceCreateImageAtIndex(imageSource, 0, sourceOptionsRef);

        // release core foundation object
        CFRelease(imageSource);
    }
    else
    {
        // Error opening image file
        HLSLoggerFatal(@"Image source could not be accessed at path %@", [self pathLastRawDataSave]);
    }
}

1 ответ

Решение

Эврика! Я нашел это! Недостающим звеном был метод fileURLWithPath ! Кроме того, я не кеширую, а также использую словарь опций создания для поиска изображений.

Это на самом деле работает:

if ([self pathLastRawDataSave])
{
    NSURL* imageFileURL = [NSURL fileURLWithPath:[self pathLastRawDataSave]];

    CFURLRef imageFileURLRef = (__bridge CFURLRef)imageFileURL; // bridged from NS-Object, no release!

    NSDictionary* sourceOptions = @{(id)kCGImageSourceShouldCache: (id)kCFBooleanFalse,
                                    (id)kCGImageSourceTypeIdentifierHint: (id)kUTTypeTIFF};

    CFDictionaryRef sourceOptionsRef = (__bridge CFDictionaryRef)sourceOptions; // bridged from NS-Object, no release!

    CGImageSourceRef imageSource = CGImageSourceCreateWithURL(imageFileURLRef, sourceOptionsRef);


    if (NULL != imageSource)
    {
        // create the image from the file
        CGImageRef imageData = CGImageSourceCreateImageAtIndex(imageSource, 0, sourceOptionsRef);

        // release core foundation object
        CFRelease(imageSource);
    }
    else
    {
        // Error opening image file
        HLSLoggerFatal(@"Image source could not be accessed at path %@", [self pathLastRawDataSave]);
    }
}
Другие вопросы по тегам