文档章节

UIImage切圆角 - 优化

hell03W
 hell03W
发布于 2016/07/20 13:44
字数 555
阅读 43
收藏 1

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)

© 著作权归作者所有

共有 人打赏支持
hell03W
粉丝 9
博文 143
码字总数 108663
作品 0
朝阳
程序员
iOS 常用组件-高效切圆角方法总结

点击上方“程序员大咖”,选择“置顶公众号” 关键时刻,第一时间送达! 前言 iOS 客户端开发中,经常碰到圆角视图的需求,本文简单总结一下 UIView 及其子类的一些切圆角方法,并且保证避免...

px01ih8
2017/12/10
0
0
UIProgressView 显示圆角问题,求大神帮忙

我用一个UIProgressView显示一个进程,设置了一下背景图片 [progressView setTrackImage:[UIImage imageNamed:@"ProgressEmpty.png"]]; [progressView setProgressImage:[UIImage imageNamed......

ios初学者
2012/11/26
1K
0
iOS 高效添加圆角效果实战讲解

圆角(RounderCorner)是一种很常见的视图效果,相比于直角,它更加柔和优美,易于接受。但很多人并不清楚如何设置圆角的正确方式和原理。设置圆角会带来一定的性能损耗,如何提高性能是另一...

刘星石
2016/03/01
10
0
滑动性能优化

个人认为比opaque属性更重要的是backgroundColor属性,如果不设置这个属性,控件依然被认为是透明的,所以我们做的第一个优化是在CustomTableCell类的init方法中添加一行代码: 虽然在白色背...

Gong_xiao
2016/02/14
34
0
UIImageView圆角,自适应图片宽高比例,图片拉伸,缩放比例

/* 设置圆角,通过layer中的cornerRadius和masksToBounds即可。 自适应图片宽高比例。通过UIViewContentModeScaleAspectFit设置,注意这个UIImageView的frame就不是init中的数据了。 同样的U...

metalmouse
2012/11/04
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

内存模型是怎么解决缓存一致性的?

在再有人问你Java内存模型是什么,就把这篇文章发给他。这篇文章中,我们介绍过关于Java内容模型的来龙去脉。 我们在文章中提到过,由于CPU和主存的处理速度上存在一定差别,为了匹配这种差距...

Java填坑之路
21分钟前
1
0
vue-cli 3.0 初体验

最近复习了下vue,突然发现vue-cli已经更新到3.0版本了,并且变化蛮大,看来要不停的学习,真是一入前端深似海。 安装步骤: 1、全局安装 npm install -g @vue/cli Vue CLI 的包名称由 vue-...

tianyawhl
23分钟前
1
0
Angular进阶之路

【初级】会写页面,能出东西。 给定环境和 rest API,不用第三方库,能在十分钟内完成一个 master/detail 结构的带路由的应用(可以不管美观)。 知识点:Angular CLI、组件、路由、HTTP 服务...

陆小七的主页
25分钟前
0
0
Redis缓存数据库安全加固指导(一)

背景 在众多开源缓存技术中,Redis无疑是目前功能最为强大,应用最多的缓存技术之一,参考2018年国外数据库技术权威网站DB-Engines关于key-value数据库流行度排名,Redis暂列第一位,但是原生...

中间件小哥
25分钟前
0
0
百万级数据mysql分区

1. 什么是表分区? 表分区,是指根据一定规则,将数据库中的一张表分解成多个更小的,容易管理的部分。从逻辑上看,只有一张表,但是底层却是由多个物理分区组成。 2. 表分区与分表的区别 分表...

罗文浩
28分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部