изменить размер UIImage, не загружая его полностью в память? - PullRequest
22 голосов
/ 02 мая 2011

Я занимаюсь разработкой приложения, в котором пользователь потенциально может попытаться загрузить очень очень большие изображения. Эти изображения сначала отображаются в виде эскизов в виде таблицы. Мой оригинальный код зависал на больших изображениях, поэтому я переписываю его, чтобы сначала загрузить изображение прямо на диск.

Известен ли способ изменения размера изображения на диске без полной загрузки его в память через UIImage? В настоящее время я пытаюсь изменить размер, используя категории UIImage, как подробно здесь , но мое приложение падает при попытке сделать миниатюру очень большого изображения (например, this - предупреждение, огромное изображение).

1 Ответ

49 голосов
/ 02 мая 2011

Вам следует взглянуть на CGImageSource в ImageIO.framework, но он доступен только с iOS 4.0.

Быстрый пример:

-(UIImage*)resizeImageToMaxSize:(CGFloat)max path:(NSString*)path
{
    CGImageSourceRef imageSource = CGImageSourceCreateWithURL((CFURLRef)[NSURL fileURLWithPath:path], NULL);
    if (!imageSource)
        return nil;

    CFDictionaryRef options = (CFDictionaryRef)[NSDictionary dictionaryWithObjectsAndKeys:
        (id)kCFBooleanTrue, (id)kCGImageSourceCreateThumbnailWithTransform,
        (id)kCFBooleanTrue, (id)kCGImageSourceCreateThumbnailFromImageIfAbsent,
        (id)@(max),
        (id)kCGImageSourceThumbnailMaxPixelSize,
        nil];
    CGImageRef imgRef = CGImageSourceCreateThumbnailAtIndex(imageSource, 0, options);

    UIImage* scaled = [UIImage imageWithCGImage:imgRef];

    CGImageRelease(imgRef);
    CFRelease(imageSource);

    return scaled;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...