前言

今天遇到了一个问题,产品以前设计了一个页面,里边的用户头像是圆形的。当时做的时候也没注意,谁知道圆形不是规则的圆形,而是有些地方有些小猫爪印在圆形的外面。然后就考虑怎么来实现这个需求,我这里有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 data
NSData *pngData = UIImagePNGRepresentation(img);
// Result image
UIImage *pngImage = [UIImage imageWithData:pngData]; 

Okay,问题解决。

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

以及参考资料

iOS方形图片裁剪成圆形相关推荐

  1. iOS 把图片裁剪成圆形

    原图: 圆形图片裁剪效果: 裁剪成带边框的圆形图片: 核心代码: #import <UIKit/UIKit.h>@interface UIImage (image)/*** 生成一张圆形图 ...

  2. ios 将矩形图片裁剪成圆形图片

    在ios中将一个正方形的图片裁剪成圆形的图片是一件非常容易的事情, 直接设置 imageView.layer.cornerRadius 这个属性, 再设置 imageView.clipsToBound ...

  3. 中如何将方形图片转换成圆形图片_【PS】PS中不可不知的实用技巧!你都掌握了吗?...

    今天给大家分享一些在PS中经常用到的实用小技巧,操作简单易上手. 01 拉伸图片人物不变形 在我们在PS里想要拉伸一些图片时,里面的人物往往会跟着一起变形,那么如何改变图片比例的同时,又不影响人物的形 ...

  4. 如何用photoshop将方形图片处理成圆形图片

    有很多朋友在使用PPT的时候都会想要将PPT中的图片素材处理成圆形,这样看起来更美观,更大方.可是,却迟迟找不到将图片处理成圆形的方法.今天小编为大家分享如何用photoshop将方形图片处理成圆形图 ...

  5. 如何把一个图片裁剪成圆形

    1.有的时候,为了工作的需要,需要吧图片裁剪成圆形.我们一般有两种思路:让承载image的ImageView变成圆形,或者把图片变成圆形. A:通过image的mask 来操作.需要添加mask目标图 ...

  6. 如何将方形图片磨成圆形图片

    如何将方形图片磨成圆形图片 在开发中经常会有一些需求,比如显示头像,显示一些特殊的需求,将图片显示成圆角或者圆形或者其他的一些形状.但是往往我们手上的图片或者从服务器 获取到的图片都是方形的.这时候就 ...

  7. QLabel将方形图片显示成圆形

    想把QLabel中传入的方形图片切成原型显示,尝试用样式表写圆角能完成纯背景色切成圆形显示,但是不能将图片切成圆形. 于是上网搜寻答案,找到了解决我疑惑的帖子 https://blog.csdn.ne ...

  8. php 将图片截取成3张,【php】php gd库怎么把一个图片裁剪成圆形的

    微信的头像现在要加水印到一张图片上 弄成 圆形的 怎么裁剪呢 Imagick提供的有 gd库 怎么做呢 因为要在微信中生成这个图片发送给用户 所以必须是生成这样的图片的 css的border-radi ...

  9. 【HTML5】网页实用技巧3:将方形图片设置成圆形后,添加圆形虚线边框

    需要实现的效果:将原本是方形的图片,变成圆形,且添加一个圆形边框 实现思路: ①制作一个正方形div盒子,将图片放在div盒子里 ②将div盒子,设置边框样式 ③将盒子设置成圆形(利用 border- ...

  10. gd剪裁圆形图片 php_php gd库怎么把一个图片裁剪成圆形的

    微信的头像现在要加水印到一张图片上 弄成 圆形的 怎么裁剪呢 Imagick提供的有 gd库 怎么做呢 因为要在微信中生成这个图片发送给用户 所以必须是生成这样的图片的 css的border-radi ...

最新文章

  1. C++_member template成员模板
  2. cve-2017-12617 tomcat远程代码执行漏洞复现测试
  3. python两数之和(hash 表)
  4. 亚马逊部分 AWS DNS 系统遭 DDoS 攻击,已达数小时之久
  5. (原)产品化:架构、过程管理
  6. 委派模式的定义及应用场景
  7. Android\OPhone动画分析之翻转效果
  8. jQuery的name选择器 模糊匹配
  9. 使用jQuery开发tab选项卡插件
  10. 2021牛客寒假算法基础集训营2,签到题FHIJ
  11. TF2.0-tf.keras.callbacks.ModelCheckpoint
  12. 忘记root密码,使用救援模式,grup设置密码
  13. Livereload介绍
  14. Software.Cradle.Suite.V11 X64 热流体模拟软件
  15. 京东价格监控软件开发技术探讨一:C#实现获取京东商品信息(价格、库存)
  16. PS制作微信公众号封面
  17. 高中时代的黑历史产物
  18. 计算机与打印机脱机后怎么共享,电脑重启后共享打印机脱机的解决方法
  19. Hankson 的趣味题
  20. 基于树莓派的手势识别Oled屏幕显示

热门文章

  1. 【高等数学】四.多元函数微分学和二重积分
  2. Flutter 如何实现禁止手机横屏的功能
  3. oracle正则表达式非数字,oracle 判断是否数字 正则表达式法
  4. Matlab textscan
  5. 北京邮电大学计算机学院合并,北京邮电大学院系重组
  6. sm缩写代表什么意思_狗狗各种表情都分别代表着什么意思
  7. 2021年,中国程序员前景一片灰暗,真的是这样吗?
  8. win10内置ubuntu, 启动时提示“指定的网络名不再可用”无法启动解决办法
  9. 关于ABAP调试中的F5,F6,F7,F8的区别和用法
  10. Linux curl 命令详解