今天遇到了一个问题,产品以前设计了一个页面,里边的用户头像是圆形的。当时做的时候也没注意,谁知道圆形不是规则的圆形,而是有些地方有些小猫爪印在圆形的外面。然后就考虑怎么来实现这个需求,我这里有2种思路来处理
把圆形切成一个图层,然后外面的爪子也当做一个图层。也就是说这个地方,本来可以用一个UIImageView,现在要用2个。摆放位置之类的到没有什么问题,主要有2点需要考虑 使用SDWebImage加载的时候,使用placeholder图片,要判断因为需求问题,我在别的页面,会把在这个页面获取到的用户头像数据传过去,所以,在别的页面,也要加判断,或者新建两个UIImageView.但是又由于另一个页面中的控件是在tableview上的呈现的,修改起来比较麻烦,所以放弃了这个思路。另一个方式:因为美工给的图是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; }讲一个期间遇到的问题: 刚开始我发现,切出来的图片,背景色是白色的,放在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 data NSData *pngData = UIImagePNGRepresentation(img); // Result image UIImage *pngImage = [UIImage imageWithData:pngData];Okay,问题解决。
这里有一个使用这两个方法的小demo
以及参考资料