CGContextRef处理圆形图片

  • 作项目的时候常常遇到过自定义cell,就拿朋友圈来讲,用户的头像也是要切圆形的,一般都是在cell里将imageView的layer作处理,像这样

UIImageView *imageView = [[UIImageView alloc] init];
imageView.layer.cornerRadius = 10;
imageView.layer.masksToBounds = YES;复制代码
  • 那么问题来了,这个layer是系统封装好的消耗的内存会相对比较大,只以一两个imageView是很难测出来,在多个须要处理的imageView时候MJ也推荐用图形上下文去处理,我本身去测试过,写一个自定义TableViewCell,添加子类控件UIImageView,用两种方法对比,layer和图形上下文切的圆形图,开始是加载20个tableVIewCell,内存消耗没有多在区别,后来加到几百个的时候内存消耗就有点明显了。

//UIImage+YMExtension.h
 
#import <UIKit/UIKit.h>
 
@interface UIImage (YMExtension)
 
/**
 * 返回圆形图片
 */
- (instancetype)ym_circleImage;
 
/**
 * 经过图片名,返回圆形图片
 */
+ (instancetype)ym_circleImageWith:(NSString *)name;
 
@end

复制代码

#import "UIImage+YMExtension.h"
 
@implementation UIImage (YMExtension)
 
- (instancetype)ym_circleImage
{
    //开启图形上下文
    UIGraphicsBeginImageContext(self.size);
    
    //上下文
    CGContextRef ctx = UIGraphicsGetCurrentContext();
    
    //添加一个圆
    CGRect rect = CGRectMake(0, 0, self.size.width, self.size.height);
    CGContextAddEllipseInRect(ctx, rect);
    
    //裁剪
    CGContextClip(ctx);
    
    //绘制图片
    [self drawInRect:rect];
    
    //得到图片
    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
    
    //关闭图形上下文
    UIGraphicsEndImageContext();
    
    
    return image;
}
 
+ (instancetype)ym_circleImageWith:(NSString *)name
{
    return [[self imageNamed:name] ym_circleImage];
}
 
 
@end
复制代码

注:下面这个类主要是处理网络加载后的图片,须要上面的类辅助,网络加载图片用的是第三方SDWebImageManager

//UIImageView+YMExtension.h
 
#import <UIKit/UIKit.h>
 
@interface UIImageView (YMExtension)
 
/**
 * 返回圆形图片
 */
- (void)ym_setCircleHeader:(NSString *)url placeholder:(NSString *)placeholder;
 
/**
 * 返回方形图片
 */
- (void)ym_setRectHeader:(NSString *)url placeholder:(NSString *)placeholder;
 
@end
复制代码

//UIImageView+YMExtension.m
#import "UIImageView+YMExtension.h"
#import <UIImageView+WebCache.h>
 
@implementation UIImageView (YMExtension)
 
/**
 返回圆形图片
 
 @param url 图片url
 @param placeholder 占位图
 */
- (void)ym_setCircleHeader:(NSString *)url placeholder:(NSString *)placeholder
{
    //设置占位图片(若是不设置这个方法,那么图片若是加载失败,图片是方形而不是圆形)
    UIImage *placeHolder = [UIImage ym_circleImageWith:placeholder];
    [self sd_setImageWithURL:[NSURL URLWithString:url] placeholderImage:placeHolder completed:^(UIImage * _Nullable image, NSError *_Nullable error, SDImageCacheType cacheType, NSURL * _Nullable imageURL) {
        
        //若是图片加载失败则返回(若是空占位图片有效)
        if (image == nil) {
            return ;
        }
        //返回圆形图片
        self.image = [image ym_circleImage];
    }];
}
 
 
/**
 返回方形图片
 
 @param url 图片url
 @param placeholder 占位图
 */
- (void)ym_setRectHeader:(NSString *)url placeholder:(NSString *)placeholder
{
    UIImage *placeHoder = [UIImage imageNamed:placeholder];
    [self sd_setImageWithURL:[NSURL URLWithString:url] placeholderImage:placeHoder];
}
 
 
@end
复制代码
相关文章
相关标签/搜索