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



我正在制作一款应用程序,它的主要功能是在表视图中显示大图像,有些图像可以是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?

您可以使用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);
}

更多详细信息请点击此处。

表视图图像应该调整大小,当然,这甚至会使它看起来比小框架中的大图像更好。现在,如果存储是一个问题,并且您有一个服务器,可以随时从中下载大型映像,那么您可以在文件系统中实现某种缓存。最多只能在其中存储n-MB的图像,每当请求当前不在文件系统中的新图像时,请删除最近使用最少的图像(或其他图像)并下载新图像。

Ps:不要使用+[UIImage imageNamed:]。它的缓存算法中有一些错误,或者它没有发布使用它加载的图像。

相关内容

  • 没有找到相关文章

最新更新