压缩和调整iOS大图像的大小

时间:2011-06-23 05:06:36

标签: iphone objective-c memory-management uiimage uiimagejpegrepresentation

我正在制作一个应用程序,其主要功能是在桌面视图中显示大图像,有些可以是1000像素宽,1MB +大小。

我发现旧设备(3GS)在处理这些设备时遇到严重问题,并迅速发出内存警告。

我无法绕过什么图像被引入,但我认为我可以在尺寸和文件大小上缩小它们。所以我调查了

NSData *dataForJPEGFile = UIImageJPEGRepresentation(img, 0.6)

用于压缩,但我不认为这有助于内存警告

并调整大小如下:

UIImage *newImage;
UIImage *oldImage = [UIImage imageWithData:imageData] ;
UIGraphicsBeginImageContext(CGSizeMake(tempImage.size.width,tempImage.size.height)); 
[oldImage drawInRect:CGRectMake(0, 0,320.0f,heightScaled)];
newImage = UIGraphicsGetImageFromCurrentImageContext(); 
UIGraphicsEndImageContext();

以及https://github.com/AliSoftware/UIImage-Resize

基本上我想拍摄一张图片并重新格式化,以便其更小,更小,并在运行中进行文件化,然后删除旧图像。这是最好的方法吗? 缓存图像会有帮助吗?与https://github.com/rs/SDWebImage一样?

2 个答案:

答案 0 :(得分:2)

您可以使用CGImageSourceCreateThumbnailAtIndex来调整大图像的大小而不先完全解码它们,这样可以节省大量内存并防止崩溃/内存警告。

如果您有要调整大小的图像的路径,可以使用:

- (void)resizeImageAtPath:(NSString *)imagePath {
    // Create the image source (from path)
    CGImageSourceRef src = CGImageSourceCreateWithURL((__bridge CFURLRef) [NSURL fileURLWithPath:imagePath], NULL);

    // To create image source from UIImage, use this
    // NSData* pngData =  UIImagePNGRepresentation(image);
    // CGImageSourceRef src = CGImageSourceCreateWithData((CFDataRef)pngData, NULL);

    // Create thumbnail options
    CFDictionaryRef options = (__bridge CFDictionaryRef) @{
            (id) kCGImageSourceCreateThumbnailWithTransform : @YES,
            (id) kCGImageSourceCreateThumbnailFromImageAlways : @YES,
            (id) kCGImageSourceThumbnailMaxPixelSize : @(640)
    };
    // Generate the thumbnail
    CGImageRef thumbnail = CGImageSourceCreateThumbnailAtIndex(src, 0, options); 
    CFRelease(src);
    // Write the thumbnail at path
    CGImageWriteToFile(thumbnail, imagePath);
}

更多详情here

答案 1 :(得分:0)

应该调整表视图图像的大小,当然,它甚至可以使它看起来比小帧中的大图像更好。现在,如果存储存在问题并且您有一台可以随时下载大图像的服务器,则可以在文件系统中实现某种缓存。只在那里存储多达n-MB的图像,并且当请求当前不在文件系统中的新图像时,删除最近最少使用的(或某些东西)并下载新的图像。

Ps:不要使用+[UIImage imageNamed:]。它在缓存算法中有一些错误,或者它不会释放你使用它加载的图像。