UIImage编辑-生成圆角图

2024-02-08 05:20
文章标签 生成 编辑 圆角 uiimage

本文主要是介绍UIImage编辑-生成圆角图,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

iOS 图片的底层编辑framework还是很强大的,CoreGraphics。

实际中的应用案例:圆形的用户头像

一般头像是用UIImageView来显示

一种很古老的圆角方法为

UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 100, 100)];imageView.image = [UIImage imageNamed:@"123"];imageView.layer.cornerRadius = imageView.frame.size.width/2.0;imageView.layer.masksToBounds = YES;

其实很多人指出来了,这种方法会降低系统性能,触发离屏渲染。

其实,可以直接对image进行操作,将image切出圆角,然后传给imageView。

这里就涉及到对图片的操作。

首先创建一个图片画布,UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale);
size为你最终需要的图片大小,第二个参数是表示是否透明。第三个参数比较特殊,缩放因子,这个需要注意,因为他的设置可能会影响到后面的图片质量。

其实还有一种默认的画布创建方法,UIGraphicsBeginImageContext(),等同于 UIGraphicsBeginImageContextWithOptions(size, NO, 1.0)。
如果在这个画布上对图片进行缩放操作,会导致缩小的图片变的更加模糊。问题就出在scale上。因为scale是1.0,而retina屏幕的像素肯定不是一倍像素,所以我们需要手动处理scale,用 UIGraphicsBeginImageContextWithOptions(size, NO, 0.0)这个方法去作图。0.0的意思就是自动调整缩放因子以适配显示屏,无论是Retina屏,还是普通屏,都可以清晰呈现。

创建好画布后,需要在画布上画出圆形的轨迹,用于剪切将要处理的图片。用Bezier曲线在画布上创建一个最大的内切圆轨迹。

    UIBezierPath *cornerPath = [UIBezierPath bezierPathWithRoundedRect:CGRectMake(0,0,size.width,size.height) byRoundingCorners:rectCornerType cornerRadii:cornerRadii];

或者

CGRect rect = CGRectMake(0, 0, size.width, size.height);UIBezierPath *path = [UIBezierPath bezierPathWithOvalInRect:rect];

然后需要根据path来clip

    [path addClip];

UIBezierPath中的addClip功能:

This method modifies the visible drawing area of the current graphics context. After calling it, subsequent drawing operations result in rendered content only if they occur within the fill area of the specified path.

简单的说,就是一个path调用addClip之后,它所在的context的可见区域就变成了它的“fill area”,接下来的绘制,如果在这个区域外都会被无视。

最后在画布上把待处理的image画上去

[self drawInRect:CGRectMake(0, 0,size.width, size.height)];

相当于把我们之前制作好的圆形path“模具”在image上切除圆形图片。

最后从画布上取出处理后的image

    UIImage *image = UIGraphicsGetImageFromCurrentImageContext();

关闭画布

    UIGraphicsEndImageContext();

当然,这样处理图片的前提是,他是正方形。

如果是非正方形,比如矩形之类的。我们裁取矩形内最大的正方形的内切圆。这话比较拗口,就是先取矩形内最大的正方形,然后取这个正方形中最大的内切圆。

这个时候就需要做些位置上的调整。

首先,因为我们需要的是圆形头像,所以画布还是正方形的。这个时候如果矩形的图片画在画布上,会有部分伸出画布的区域。伸出的部分我们不需要,不用管。

draw image的时候就需要注意了,在哪个位置画。例如图片的长度大于宽度的时候,为了保证切到图片的正中央,原来的图片draw的坐标为(0,0),这时候需要将图片往左移动(-n,0),n为画布的长度减去图片长度然后除以2。

打个比方,圆形的Bezier曲线path是一个圆形的铁框,然后要剪切的图片为一块豆腐,豆腐长度比铁框半径大,所以需要把豆腐往作移动,然后往下一按,再取出铁框里的圆形豆腐,就是我们需要的结果。→_→

剪切示例图

这篇关于UIImage编辑-生成圆角图的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/690017

相关文章

MybatisGenerator文件生成不出对应文件的问题

《MybatisGenerator文件生成不出对应文件的问题》本文介绍了使用MybatisGenerator生成文件时遇到的问题及解决方法,主要步骤包括检查目标表是否存在、是否能连接到数据库、配置生成... 目录MyBATisGenerator 文件生成不出对应文件先在项目结构里引入“targetProje

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log

Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南

《Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南》在日常数据处理工作中,我们经常需要将不同Excel文档中的数据整合到一个新的DataFrame中,以便进行进一步... 目录一、准备工作二、读取Excel文件三、数据叠加四、处理重复数据(可选)五、保存新DataFram

SpringBoot生成和操作PDF的代码详解

《SpringBoot生成和操作PDF的代码详解》本文主要介绍了在SpringBoot项目下,通过代码和操作步骤,详细的介绍了如何操作PDF,希望可以帮助到准备通过JAVA操作PDF的你,项目框架用的... 目录本文简介PDF文件简介代码实现PDF操作基于PDF模板生成,并下载完全基于代码生成,并保存合并P

详解Java中如何使用JFreeChart生成甘特图

《详解Java中如何使用JFreeChart生成甘特图》甘特图是一种流行的项目管理工具,用于显示项目的进度和任务分配,在Java开发中,JFreeChart是一个强大的开源图表库,能够生成各种类型的图... 目录引言一、JFreeChart简介二、准备工作三、创建甘特图1. 定义数据集2. 创建甘特图3.

AI一键生成 PPT

AI一键生成 PPT 操作步骤 作为一名打工人,是不是经常需要制作各种PPT来分享我的生活和想法。但是,你们知道,有时候灵感来了,时间却不够用了!😩直到我发现了Kimi AI——一个能够自动生成PPT的神奇助手!🌟 什么是Kimi? 一款月之暗面科技有限公司开发的AI办公工具,帮助用户快速生成高质量的演示文稿。 无论你是职场人士、学生还是教师,Kimi都能够为你的办公文

pdfmake生成pdf的使用

实际项目中有时会有根据填写的表单数据或者其他格式的数据,将数据自动填充到pdf文件中根据固定模板生成pdf文件的需求 文章目录 利用pdfmake生成pdf文件1.下载安装pdfmake第三方包2.封装生成pdf文件的共用配置3.生成pdf文件的文件模板内容4.调用方法生成pdf 利用pdfmake生成pdf文件 1.下载安装pdfmake第三方包 npm i pdfma

poj 1258 Agri-Net(最小生成树模板代码)

感觉用这题来当模板更适合。 题意就是给你邻接矩阵求最小生成树啦。~ prim代码:效率很高。172k...0ms。 #include<stdio.h>#include<algorithm>using namespace std;const int MaxN = 101;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int n

poj 1287 Networking(prim or kruscal最小生成树)

题意给你点与点间距离,求最小生成树。 注意点是,两点之间可能有不同的路,输入的时候选择最小的,和之前有道最短路WA的题目类似。 prim代码: #include<stdio.h>const int MaxN = 51;const int INF = 0x3f3f3f3f;int g[MaxN][MaxN];int P;int prim(){bool vis[MaxN];

poj 2349 Arctic Network uva 10369(prim or kruscal最小生成树)

题目很麻烦,因为不熟悉最小生成树的算法调试了好久。 感觉网上的题目解释都没说得很清楚,不适合新手。自己写一个。 题意:给你点的坐标,然后两点间可以有两种方式来通信:第一种是卫星通信,第二种是无线电通信。 卫星通信:任何两个有卫星频道的点间都可以直接建立连接,与点间的距离无关; 无线电通信:两个点之间的距离不能超过D,无线电收发器的功率越大,D越大,越昂贵。 计算无线电收发器D