调整UIImage的大小而不将其完全加载到内存中?

问题描述:

我正在开发一个应用程序,用户可能会尝试加载非常大的图像。这些图像首先显示为表格视图中的缩略图。我的原始代码会在大图像上崩溃,所以我正在重写它以首先将图像直接下载到磁盘。调整UIImage的大小而不将其完全加载到内存中?

是否有一种已知的方法来调整磁盘上的映像的大小,而不通过UIImage将其完全加载到内存中?我目前正在尝试使用UIImage上的类别作为详细的here来调整大小,但我的应用在试图缩小非常大的图像时崩溃(例如,this - 警告,巨大图像)。

你应该看看ImageIO.framework中的CGImageSource,但它只能在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; 
} 
+0

我怎么可以添加高度和宽度的分离式价值?这是视网膜的价值?我必须为视网膜ipad屏幕选择2048或1024吗? – Raegtime 2014-10-07 08:59:12

+1

你应该做x * [UIScreen mainScreen] .scale – 2014-12-07 10:28:43

+0

@max在这里是什么? – 2018-02-19 11:23:27