图片加载的两种方式
1、[UIImage imageNamed:nil];
图片加载后一直在内存中,知道程序结束才会被释放。(速度快,但耗内存)
2、从图片路径加载,不用时会被释放,要用时重新加载。(省内存,但速度慢)
NSString*path = [[NSBundle mainBundle]pathForResource:@'"图片的名字"ofType:@"文件类型"];
UIImage*image = [UIImage imageWithContentsOfFile:path];
UIImageView *imageView = [[UIImageView alloc] initWithImage: image];
[self addSubView: imageView];
上面的第二种方式,虽然可以释放掉,但我们要告诉人家什么时候释放。也就是说,当前显示页面不是这个view时,我们便将它释放掉:
//离开界面时,释放对象
- (void)viewWillDisappear:(BOOL)animated{
[imageView removeFromSuperview];
imageView = nil;
}
再次进入这个view时,将移除掉的UIImageView再次添加进来
- (void)viewDidAppear:(BOOL)animated{
[self addSubView: imageView];
}
图片压缩(重新绘图)
为UIImage添加分类方法
//缩放到指定宽度
- (UIImage *)compressImage:(UIImage *)sourceImage toTargetWidth:(CGFloat)targetWidth {
//获得源文件的尺寸
CGSize imageSize = sourceImage.size;
CGFloat width = imageSize.width;
CGFloat height = imageSize.height;
//根据比例计算缩放后的高度
CGFloat targetHeight = (targetWidth / width) * height;
//UIGraphicsBeginImageContext:创建一个基于位图的上下文(context),并将其设置为当前上下文(context)。
//UIGraphicsBeginImageContext(CGSizeMake(targetWidth, targetHeight)); (这个出来的图很模糊)
//无损压缩
UIGraphicsBeginImageContextWithOptions(CGSizeMake(targetWidth, targetHeight),0,[[UIScreen mainScreen] scale]);
//drawInRect 重新绘图,UIView的绘图上下文属于当前图形上下文
[sourceImage drawInRect:CGRectMake(0, 0, targetWidth, targetHeight)];
//从当前上下文中获取一个UIImage对象
UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
//关闭图形上下文
UIGraphicsEndImageContext();
return newImage;
}
参考文献
1、 UIGraphicsBeginImageContext系列知识
2、IOS 多个UIImageView 加载高清大图时内存管理
3、iOS图片压缩处理
4、使用 drawInRect 绘图时丢失清晰度解决方法
5、drawInRect: losing Quality of Image resolution
6、iOS绘图详解
7|iOS绘图教程