iOS方形图片裁剪成圆形

来源:互联网 发布:千语淘客软件下载 编辑:程序博客网 时间:2024/05/16 12:43

前言

今天遇到了一个问题,产品以前设计了一个页面,里边的用户头像是圆形的。当时做的时候也没注意,谁知道圆形不是规则的圆形,而是有些地方有些小猫爪印在圆形的外面。然后就考虑怎么来实现这个需求,我这里有2种思路来处理

  1. 把圆形切成一个图层,然后外面的爪子也当做一个图层。也就是说这个地方,本来可以用一个UIImageView,现在要用2个。摆放位置之类的到没有什么问题,主要有2点需要考虑
    1. 使用SDWebImage加载的时候,使用placeholder图片,要判断
    2. 因为需求问题,我在别的页面,会把在这个页面获取到的用户头像数据传过去,所以,在别的页面,也要加判断,或者新建两个UIImageView.但是又由于另一个页面中的控件是在tableview上的呈现的,修改起来比较麻烦,所以放弃了这个思路。
  2. 另一个方式:因为美工给的图是png格式的,也就是说默认背景色是透明的,所以,我们可以不修改这个页面放置的UIImageView的cornerRadius,就默认放一个正方形的,但是想要用户的照片是圆形的。所以,我们可以把用户上传的照片修改成圆形

这就是今天的重点了。

废话不多说了。直接上代码

///把图片裁剪成圆形//两个参数 image: 需要修改的图片//inset: 内部偏移-(UIImage *) circleImage:(UIImage*) image withParam:(CGFloat) inset {    UIGraphicsBeginImageContextWithOptions(image.size, NO, 0);    CGContextRef context = UIGraphicsGetCurrentContext();    CGContextSetFillColorWithColor(context, [UIColor clearColor].CGColor);    CGContextFillPath(context);    CGContextSetLineWidth(context, .5);    CGContextSetStrokeColorWithColor(context, [UIColor clearColor].CGColor);    CGRect rect = CGRectMake(inset, inset, image.size.width - inset * 2.0f, image.size.height - inset * 2.0f);    CGContextAddEllipseInRect(context, rect);    CGContextClip(context);    [image drawInRect:rect];    CGContextAddEllipseInRect(context, rect);    CGContextStrokePath(context);    UIImage *newimg = UIGraphicsGetImageFromCurrentImageContext();    UIGraphicsEndImageContext();    return newimg;}

另外还有一个代码片段,是修改图片的frame的

///把图片修改成固定大小- (UIImage *)scaleFromImage:(UIImage *)image size:(CGSize)size {    UIGraphicsBeginImageContext(size);    [image drawInRect:CGRectMake(0, 0, size.width, size.height)];    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();    UIGraphicsEndImageContext();    return newImage;}

PS

讲一个期间遇到的问题:
刚开始我发现,切出来的图片,背景色是白色的,放在View上很影响使用。然后就开始找各种方面可能出现的问题。编程就是这样。不要怕各种问题。发现问题了,挨个排查就好了。(所以现在给我感觉,没有什么是能难倒我的,嗯!自信脸,不要打我!!)

在这里要说一下UIGraphicsBeginImageContextWithOptions(image.size, NO, 0);这个方法。
第一个参数,就是需要导入的图片的大小,
第二个:不透明度(YES,不透明,图片为黑色,NO,透明)
第三个参数:缩放因子,填入为0的话,图片会根据外面传入frame的大小来设定。

这里图片剪切的时候,已经为PNG了,但是运行程序之后,发现还是不行,所以咱们就接着往上排查,因为用户是拍照之后然后对照片进行编辑的,所以,我们就去看下刚拍完照的信息,结果发现,调用UIImagePickerController之后,照片的格式是JPEG的。

这么一来,我们就找到了问题所在了,然后我就把拍照信息从JPG转换成PNG

UIImage *img = (UIImage *)info[UIImagePickerControllerOriginalImage];// Convert it in to PNG dataNSData *pngData = UIImagePNGRepresentation(img); // Result imageUIImage *pngImage = [UIImage imageWithData:pngData]; 

Okay,问题解决。

这里有一个使用这两个方法的小demo

以及参考资料

0 0
原创粉丝点击