我正在制作一个应用程序,其主要功能是在桌面视图中显示大图像,有些可以是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一样?
答案 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:]
。它在缓存算法中有一些错误,或者它不会释放你使用它加载的图像。