图片加载管理

图片加载的两种方式

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绘图教程

你可能感兴趣的:(图片加载管理)