11_iOS干货8_关于imageView和image的几点思考和总结

一,读取图片

    1,资源读取:imageNamed方法:传图片名称(该方法优先读取缓存,取不到再遍历资源图片,取道后放到缓存。常用在多次存取的小文件使用,提高获取速度)

    2,本地读取:imageWithContentsOfFile方法:传图片路径(大图片,不经常使用的图片时使用,减少内存消耗)

    3,网络读取:initWithData方法:传[NSData dataWithContentsOfURL:url](网络读取大图片资源时使用)

    4,通过本地绘制的context获取image

    5,用Quartz的CGImageSourceRef来读取image

二,绘制图片

    1.UIImageView方式加入到UIView层

    2.[img drawAtPoint]系列方法

    3.CGContextDrawImage方法

    4.CGLayer方法

    这个是apple推荐的一种offscreen的绘制方法,相比bitmapContext更好,因为它似乎会利用iphone硬件(drawing-card)加速

1. CGLayerRef cg=CGLayerCreateWithContext(ctx, CGSizeMake(320, 480), NULL);  
2. //需要将CGLayerContext来作为缓存context,这个是必须的  
3. CGContextRef layerContext=CGLayerGetContext(cg);  
4. CGContextDrawImage(layerContext, CGRectMake(160, 230, 160, 230), img);   
5. CGContextDrawLayerAtPoint(ctx, CGPointMake(0, 0), cg);  

    5,CALayer的contents

1. UIImage* image=[UIImage imageNamed:@"1.jpg"];  
2. CALayer *ly=[CALayer layer];  
3. ly.frame=CGRectMake(0, 0, 320, 460);  
4. ly.contents=[image CGImage];  
5. [self.layer addSublayer:ly];  

三,保存图片(png或者jpeg的格式保存)

 

     NSData *imgData = UIImagePNGRepresentation(imgFromUrl);    

      NSData *imgData = UIImageJPEGRepresentation(imgFromUrl,0);   

     [imgData writeToFile:aPath atomically:YES]

四,imageView的圆角方案

    方案1:

imgView.layer.cornerRadius = imgView.frame.size.width/2.0;
imgView.layer.masksToBounds = YES;
或者第二种:
imgView.layer.cornerRadius = imgView.frame.size.width/2.0;
imgView.clipsToBounds = YES;
备注:clipsToBounds是对view的切割,masksToBounds是对layer的切割
性能消耗:
这个是离屏渲染(off-screen-rendering),对性能消耗比较大
fps大致在45帧左右(每个cell 做2个imageview)
正常fps是60帧,越小,用户体验越差

离屏渲染,指的是GPU在当前屏幕缓冲区以外新开辟一个缓冲区进行渲染操作。由上面的一个结论视图和圆角的大小对帧率并没有什么卵影响,数量才是伤害的核心输出啊。可以知道离屏渲染耗时是发生在离屏这个动作上面,而不是渲染。为什么离屏这么耗时?原因主要有创建缓冲区和上下文切换。创建新的缓冲区代价都不算大,付出最大代价的是上下文切换。

方案2:
CAShapeLayer *layer = [CAShapeLayer layer];  
UIBezierPath *aPath = [UIBezierPath bezierPathWithOvalInRect:aImageView.bounds];  
layer.path = aPath.CGPath;  

poImgView.layer.mask = layer; 性能消耗: 测试fps大致在20帧左右,比方案1的消耗更大

方案3:
- (UIImage *)imageWithCornerRadius:(CGFloat)radius {
CGRect rect = (CGRect){0.f, 0.f, self.size};
UIGraphicsBeginImageContextWithOptions(self.size, NO, UIScreen.mainScreen.scale);
CGContextAddPath(UIGraphicsGetCurrentContext(),
[UIBezierPath bezierPathWithRoundedRect:rect cornerRadius:radius].CGPath);
CGContextClip(UIGraphicsGetCurrentContext());
[self drawInRect:rect];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return image;
}
性能消耗:这个是on-screen-rendering
相当于时时去做渲染,相比于1和2方案的离线渲染,此方法对性能消耗最低,推荐用此方案。

总结:

方案A和方案B都是比较常见的方式,但是都不推荐,对此的优化方案是是用方案3

但是如果已使用1或者2方案,补救措施是:

self.layer.shouldRasterize = YES;  
self.layer.rasterizationScale = [UIScreen mainScreen].scale;

五,根据颜色返回一张纯色图片

- (UIImage *)buttonImageFromColor:(UIColor *)color{
    UIImageJPEGRepresentation
    CGRect rect = CGRectMake(0, 0, self.view.frame.size.width, self.view.frame.size.height);
    UIGraphicsBeginImageContext(rect.size);
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetFillColorWithColor(context, [color CGColor]);
    CGContextFillRect(context, rect);
    UIImage *img = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return img;
}

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值