UIImage切圆角 - 优化
2016-07-20 00:00
274 查看
摘要: 好吧,这的却是老生常谈的问题,以前在网上找别人的方法切,但是自己用时候总是发现效果不很理想, 今天终于彻底解决了 ~
如下, 通过
第一步, 先将原始图片进行等比例缩放;
第二步, 截取等比缩放后正中央的正方形图片;
第三部, 将正方形图像切割成圆角图像.
UIImage等比例缩放并切圆角
如题, 在网上找的代码也是可以用的, 但是问题是切成圆角时, 如果图片本身不是正方形就会导致图片变形,被压缩或者拉伸. 今上午阅读了那一段代码, 然后自己写出了任意长宽的图片, 都可以等比例缩放并切割成圆角图片, 默认切取图像正中央的位置.[@interface](http://my.oschina.net/u/996807) UIImage (Extension) ///将UIImage图像切成圆形的图像, 指定宽度(边长) - (UIImage *)circleImageWithWidth:(double)width; ///切成圆形的图片 - (UIImage *)cuttingCicleImageWithSize:(CGSize)size; ///缩放图片尺寸 - (UIImage *)zoomImageToSize:(CGSize)size; ///按照比例缩放图片, 原始图片为1, 参数(0~1) - (UIImage *)zoomImageWithScale:(float)scale; [@end](http://my.oschina.net/u/567204)
如下, 通过
- (UIImage *)circleImageWithWidth:(double)width方法进行操作的,
第一步, 先将原始图片进行等比例缩放;
第二步, 截取等比缩放后正中央的正方形图片;
第三部, 将正方形图像切割成圆角图像.
@implementation UIImage (Extension) ///将UIImage图像切成圆形的图像, 指定宽度(边长) - (UIImage *)circleImageWithWidth:(double)width { // 计算一些变量, 供后面使用 float screenScale = [[UIScreen mainScreen] scale]; float scale = width / MIN(self.size.width, self.size.height); CGSize originalScaleSize = CGSizeMake(self.size.width * scale, self.size.height * scale); CGRect centerRange = CGRectOffset(CGRectMake(0, 0, width, width), (originalScaleSize.width-width)/2, (originalScaleSize.height-width)/2); // 调用方法将图像缩放到指定的比例 UIImage *newImage = [self zoomImageWithScale:scale]; // 开始获取图片中间 正方形区域 CGImageRef imageRef = newImage.CGImage; CGImageRef subImageRef = CGImageCreateWithImageInRect(imageRef, CGRectMake(centerRange.origin.x, centerRange.origin.y, centerRange.size.width * screenScale, centerRange.size.height * screenScale)); newImage = [UIImage imageWithCGImage:subImageRef]; //切成圆角并返回图像 return [newImage cuttingCicleImageWithSize:CGSizeMake(width, width)]; } ///切成圆形的图片 - (UIImage *)cuttingCicleImageWithSize:(CGSize)size { double screenScale = [[UIScreen mainScreen] scale]; CGRect rect = CGRectMake(0, 0, size.width, size.height); UIGraphicsBeginImageContextWithOptions(size, NO, screenScale); CGContextRef ctx = UIGraphicsGetCurrentContext(); CGContextAddEllipseInRect(ctx, rect); CGContextClip(ctx); [self drawInRect:rect]; UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage; } ///缩放图片尺寸 - (UIImage *)zoomImageToSize:(CGSize)size { UIGraphicsBeginImageContextWithOptions(size, NO, [[UIScreen mainScreen] scale]); [self drawInRect:CGRectMake(0, 0, size.width, size.height)]; UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext(); return newImage; } ///按照比例缩放图片, 原始图片为1, 参数(0~1) - (UIImage *)zoomImageWithScale:(float)scale { CGSize targetSize = CGSizeMake(self.size.width * scale, self.size.height * scale); return [self zoomImageToSize:targetSize]; } [@end](http://my.oschina.net/u/567204)
相关文章推荐
- lucene 4.X 中的域缓存(FieldCache)和DocValue
- iOS中的UILabel自动计算高度和换行
- UIImage保存到沙盒
- Hibernate的事务模式与反模式
- UE4类修饰符
- UE4类修饰符
- $.ajax请求报400 bad request错误
- 【NGUI】ui tween 和 play tween
- 【一天一道LeetCode】#374. Guess Number Higher or Lower
- 【一天一道LeetCode】#374. Guess Number Higher or Lower
- String, StringBuilder, StringBuffer 之间的区别 - Java
- gulp+webpack+vue
- 关于UIBarButtonItem的style属性(Plain,Bordered,Done的区别)
- HUE的安装
- UISegmentedControl分段控件使用
- iOS 中UITableView的深理解
- 103.项目视图分析工具Reveal集成使用教程
- Hbuilder MUI用原生js添加或移除class属性
- 小米2s 用线刷,刷回MIUI V5了
- (2016.12.2更新)CnCrypt加密U盘1.18,将U盘划分为普通盘和加密盘,支持与U盘启动盘共存