我正在制作一款应用程序,它的主要功能是在表视图中显示大图像,有些图像可以是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:]
。它的缓存算法中有一些错误,或者它没有发布使用它加载的图像。