Core Image загружает данные изображения немедленно?

StackOverflow https://stackoverflow.com//questions/11680237

  •  12-12-2019
  •  | 
  •  

Вопрос

Допустим, я хочу узнать размер изображения, поэтому, если пользователь попытается загрузить изображение размером 10 000x10 000 пикселей в мое приложение для iPad, я смогу представить ему диалоговое окно и избежать сбоя.Если я сделаю [UIImage imageNamed:] или [UIImage imageWithContentsOfFile:] это немедленно загрузит мое потенциально большое изображение в память.

Если вместо этого я использую Core Image, скажите так:

CIImage *ciImage = [CIImage imageWithContentsOfURL:[NSURL fileURLWithPath:imgPath]];

Тогда спроси моего нового CIImage для своего размера:

CGSize imgSize = ciImage.extent.size;

Будет ли это загружать все изображение в память, чтобы сообщить мне об этом, или оно просто просмотрит метаданные файла, чтобы определить размер изображения?

Это было полезно?

Решение

А imageWithContentsOfURL функция загружает изображение в память, да.

К счастью, Apple реализовала CGImageSource для чтения метаданных изображения без загрузки реальных данных пикселей в память в iOS4, вы можете прочитать о том, как их использовать в этом сообщении блога (удобно, что он предоставляет пример кода о том, как получить размеры изображения).

РЕДАКТИРОВАТЬ:Вставил сюда пример кода для защиты от гниения ссылок:

#import <ImageIO/ImageIO.h>

NSURL *imageFileURL = [NSURL fileURLWithPath:...];
CGImageSourceRef imageSource = CGImageSourceCreateWithURL((CFURLRef)imageFileURL, NULL);
if (imageSource == NULL) {
    // Error loading image
    ...
    return;
}

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
                     [NSNumber numberWithBool:NO], (NSString *)kCGImageSourceShouldCache,nil];
CFDictionaryRef imageProperties = CGImageSourceCopyPropertiesAtIndex(imageSource, 0, (CFDictionaryRef)options);
if (imageProperties) {
    NSNumber *width = (NSNumber *)CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelWidth);
    NSNumber *height = (NSNumber *)CFDictionaryGetValue(imageProperties, kCGImagePropertyPixelHeight);
    NSLog(@"Image dimensions: %@ x %@ px", width, height);
    CFRelease(imageProperties);
}

Полная ссылка на API: также доступно здесь.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top