Подтвердить что ты не робот

Изменяя размер UIImage, не загружая его полностью в память?

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

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

4b9b3361

Ответ 1

Вы должны взглянуть на 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;
}