在我的应用程序中,我需要通过代码创建将要使用的图像。我下载全屏版本的图像,然后创建我需要的所有剪报。这种方法减少了用户将从服务器下载的 MB。下载的图像约为 300。iPad 非视网膜尺寸为 1024x768,iPad 视网膜尺寸为 2048x1536。
这是我用来调整图像大小以创建我需要的剪报的算法。为每个图像创建另一个缩小版本,然后将保存在 Document 文件夹中。
我使用ARC和GCD。
CGFloat screenScale = [UIScreen mainScreen].scale;
NSString * imagePath = [[NSBundle mainBundle]pathForResource:imageName ofType:nil];
UIImage * image = [UIImage imageWithContentsOfFile:imagePath];
CGSize newImageSize = [image resizeImageSettingWidth:(380.0f * screenScale)];
UIGraphicsBeginImageContext(newImageSize);
[image drawInRect:CGRectMake(0,0,newImageSize.width,newImageSize.height)];
UIImage* newImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
NSData *jpegData = UIImageJPEGRepresentation(newImage, 0.9f);
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:0];
NSString * newImageName;
if ([[UIScreen mainScreen] respondsToSelector:@selector(displayLinkWithTarget:selector:)] &&
([UIScreen mainScreen].scale == 2.0)) {
newImageName = [NSString stringWithFormat:@"%@-article@2x.jpg", [imageName stringByDeletingPathExtension]];
}
else {
newImageName = [NSString stringWithFormat:@"%@-article.jpg", [imageName stringByDeletingPathExtension]];
}
NSString *filePath = [documentsPath stringByAppendingPathComponent:newImageName];
[jpegData writeToFile:filePath atomically:YES];
在未知数量的调整大小后,应用程序可能因内存警告而崩溃。崩溃仅发生在第四代 iPad 上,在 iPad2 上完美运行。也许问题是自动释放对象释放较晚,这会产生内存积累?