文档章节

UIImage切圆角 - 优化

hell03W
 hell03W
发布于 2016/07/20 13:44
字数 555
阅读 69
收藏 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
博文 145
码字总数 109892
作品 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
2.2K
0
UIImageView圆角,自适应图片宽高比例,图片拉伸,缩放比例

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

metalmouse
2012/11/04
2.5K
0
Swift工具类总结

swift出来也好长时间了,现在swift出到了4.0,版本也相对比较稳定了,所以决定准备用swift来开发新的项目。俗话说工欲善其事,必先利其器,所以在开始正式写项目之前我总结了一些常用的工具类...

辉哥de简书
2018/01/10
0
0
iOS 高效添加圆角效果实战讲解

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

刘星石
2016/03/01
38
0

没有更多内容

加载失败,请刷新页面

加载更多

DDD(五)

1、引言 之前学习了解了DDD中实体这一概念,那么接下来需要了解的就是值对象、唯一标识。值对象,值就是数字1、2、3,字符串“1”,“2”,“3”,值时对象的特征,对象是一个事物的具体描述...

MrYuZixian
14分钟前
0
0
数据库中间件MyCat

什么是MyCat? 查看官网的介绍是这样说的 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务、ACID、可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵...

沉浮_
今天
4
0
解决Mac下VSCode打开zsh乱码

1.乱码问题 iTerm2终端使用Zsh,并且配置Zsh主题,该主题主题需要安装字体来支持箭头效果,在iTerm2中设置这个字体,但是VSCode里这个箭头还是显示乱码。 iTerm2展示如下: VSCode展示如下: 2...

HelloDeveloper
今天
6
0
常用物流快递单号查询接口种类及对接方法

目前快递查询接口有两种方式可以对接,一是和顺丰、圆通、中通、天天、韵达、德邦这些快递公司一一对接接口,二是和快递鸟这样第三方集成接口一次性对接多家常用快递。第一种耗费时间长,但是...

程序的小猿
今天
4
0
Python机器学习之数据探索可视化库yellowbrick

背景介绍 从学sklearn时,除了算法的坎要过,还得学习matplotlib可视化,对我的实践应用而言,可视化更重要一些,然而matplotlib的易用性和美观性确实不敢恭维。陆续使用过plotly、seaborn,...

yeayee
今天
8
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部