我正在尝试使用 AsyncImageView (https://github.com/nicklockwood/AsyncImageView)作为封面实现 Coverflow(iCarousel)。它适用于大小高达4 MB的图像。但是,当尝试加载大小超过10 MB的图像时,应用程序崩溃了。我的问题是 -
1)我可以加载大小为10 MB的图像而不需要平铺吗?由于图像源来自设备相机,是否可以平铺这些图像然后加载这些图像。如果是这样,你可以在拼贴大图像时分享一些想法/代码块吗?
Ps:我尝试使用UIImageJPEGRepresentation(图像,比例)压缩图像,虽然图像大小从10 MB减少到100 KB,但是当我尝试加载压缩图像时,记忆问题再次出现。 (看起来iOS在某种程度上解压缩)
答案 0 :(得分:3)
您对图像的尺寸及其在磁盘上的尺寸感到困惑。
在内存中,图像采用WIDTH * HEIGHT * 4像素,所以假设您的图像是1000x1000px,最终使用的是4Mb ram。
UIImageJPEGRepresentation使用压缩系数保存图像,因此最终在磁盘上显示较小的图像,但图像的尺寸仍然相同。
要解决您的问题,您需要将下载的图像缩放到封面项目的正确尺寸。
您可以使用ImageIO框架执行此操作:
答案 1 :(得分:0)
这是工作代码
UIImage *result = nil;
if ([data length]) { // NSData of the image
CGImageSourceRef sourceRef = CGImageSourceCreateWithData((CFDataRef)data, nil);
NSMutableDictionary *options = [NSMutableDictionary dictionary];
[options setObject:(id)kCFBooleanTrue forKey:(id)kCGImageSourceCreateThumbnailFromImageIfAbsent];
[options setObject:[NSNumber numberWithInt:400] forKey:(id)kCGImageSourceThumbnailMaxPixelSize];
CGImageRef imageRef = CGImageSourceCreateThumbnailAtIndex(sourceRef, 0, (CFDictionaryRef)options);
if (imageRef) {
result = [UIImage imageWithCGImage:imageRef]; //Resulting image
CGImageRelease(imageRef);
}
if (sourceRef) CFRelease(sourceRef);