一个简单的创建圆角图像的UIImage扩展实现

Swift中基于UIImage的实用扩展分类项目:实现颜色生成图片与常用图像处理功能 提供了精细控制各角落的能力。使用示例:适用于底部弹窗类卡片。场景推荐参数对话框顶部底部工具栏标签徽章, 半径≈高度一半气泡聊天框结合三角箭头路径合成结合缓存机制:return nil特性Core Image易用性高中执行速度快极快开发成本低高典型用途滤镜、色彩校正实时视频处理、AI推理。 阅读详情
在iOS开发中经常需要用到圆角图像。简单搜索一下就能找到很多创建圆角图像的实现代码。我在 Stack Overflow 上找到了一段代码,略微修改了一下,写了个简单的Category方法,可以用来创建圆角图像。代码如下:
 
/* UIImage+RoundedRect.h*/
#import <UIKit/UIKit.h>

@interface UIImage (RoundedCorner)
- (UIImage *)roundedCornerImageWithCornerRadius:(CGFloat)cornerRadius;
@end

/* UIImage+RoundedRect.m*/

#import "UIImage+RoundedCorner.h"

@implementation UIImage (RoundedCorner)

- (UIImage *)roundedCornerImageWithCornerRadius:(CGFloat)cornerRadius {
    CGFloat w = self.size.width;
    CGFloat h = self.size.height;
    CGFloat scale = [UIScreen mainScreen].scale;
    // 防止圆角半径小于0,或者大于宽/高中较小值的一半。
    if (cornerRadius < 0)
        cornerRadius = 0;
    else if (cornerRadius > MIN(w, h))
        cornerRadius = MIN(w, h) / 2.;

    UIImage *image = nil;
    CGRect imageFrame = CGRectMake(0., 0., w, h);
    UIGraphicsBeginImageContextWithOptions(self.size, NO, scale);
    [[UIBezierPath bezierPathWithRoundedRect:imageFrame cornerRadius:cornerRadius] addClip];
    [self drawInRect:imageFrame];
    image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

    return image;
}

@end

把这个Category添加到项目中之后,直接对UIImage对象调用- roundedCornerImageWithCornerRadius:方法即可。以上实现并非最高效,最佳的实现,但是有时候Quick and Dirty的方法已经足够好了,是吧。(天音:你就自我安慰吧。)

#import  < Foundation / Foundation.h >

typedef 
enum  {
    UIImageRoundedCornerTopLeft 
=   1 ,
    UIImageRoundedCornerTopRight 
=   1   <<   1 ,
    UIImageRoundedCornerBottomRight 
=   1   <<   2 ,
    UIImageRoundedCornerBottomLeft 
=   1   <<   3
} UIImageRoundedCorner;

@interface UIImage (Utility)

// + (void)addRoundedRectToPath(CGContextRef context, CGRect rect, float radius, UIImageRoundedCorner cornerMask);

-  (UIImage  * )roundedRectWith:( float )radius cornerMask:(UIImageRoundedCorner)cornerMask;

@end

 

 实现文件

 

#import  " UIImage+Utility.h "

// UIKit坐标系统原点在左上角,y方向向下的(坐标系A),但在Quartz中坐标系原点在左下角,y方向向上的(坐标系B)。图片绘制也是颠倒的。
static   void  addRoundedRectToPath(CGContextRef context, CGRect rect,  float  radius, UIImageRoundedCorner cornerMask)
{
    
// 原点在左下方,y方向向上。移动到线条2的起点。
    CGContextMoveToPoint(context, rect.origin.x, rect.origin.y  +  radius);
    
    
// 画出线条2, 目前画线的起始点已经移动到线条2的结束地方了。
    CGContextAddLineToPoint(context, rect.origin.x, rect.origin.y  +  rect.size.height  -  radius);
    
    
// 如果左上角需要画圆角,画出一个弧线出来。
     if  (cornerMask  &  UIImageRoundedCornerTopLeft) {
        
        
// 已左上的正方形的右下脚为圆心,半径为radius, 180度到90度画一个弧线,
        CGContextAddArc(context, rect.origin.x  +  radius, rect.origin.y  +  rect.size.height  -  radius,
                        radius, M_PI, M_PI 
/   2 ,  1 );
    }
   
    
else  {
         
// 如果不需要画左上角的弧度。从线2终点,画到线3的终点,
        CGContextAddLineToPoint(context, rect.origin.x, rect.origin.y  +  rect.size.height);
        
        
// 线3终点,画到线4的起点
        CGContextAddLineToPoint(context, rect.origin.x  +  radius, rect.origin.y  +  rect.size.height);
    }
    
    
// 画线4的起始,到线4的终点
    CGContextAddLineToPoint(context, rect.origin.x  +  rect.size.width  -  radius,
                            rect.origin.y 
+  rect.size.height);

    
// 画右上角
     if  (cornerMask  &  UIImageRoundedCornerTopRight) {
        CGContextAddArc(context, rect.origin.x 
+  rect.size.width  -  radius,
                        rect.origin.y 
+  rect.size.height  -  radius, radius, M_PI  /   2 ,  0.0f ,  1 );
    }
    
else  {
        CGContextAddLineToPoint(context, rect.origin.x 
+  rect.size.width, rect.origin.y  +  rect.size.height);
        CGContextAddLineToPoint(context, rect.origin.x 
+  rect.size.width, rect.origin.y  +  rect.size.height  -  radius);
    }

    CGContextAddLineToPoint(context, rect.origin.x 
+  rect.size.width, rect.origin.y  +  radius);

    
// 画右下角弧线
     if  (cornerMask  &  UIImageRoundedCornerBottomRight) {
        CGContextAddArc(context, rect.origin.x 
+  rect.size.width  -  radius, rect.origin.y  +  radius,
                        radius, 
0.0f ,  - M_PI  /   2 ,  1 );
    }
    
else  {
        CGContextAddLineToPoint(context, rect.origin.x 
+  rect.size.width, rect.origin.y);
        CGContextAddLineToPoint(context, rect.origin.x 
+  rect.size.width  -  radius, rect.origin.y);
    }

    CGContextAddLineToPoint(context, rect.origin.x 
+  radius, rect.origin.y);

    
// 画左下角弧线
     if  (cornerMask  &  UIImageRoundedCornerBottomLeft) {
        CGContextAddArc(context, rect.origin.x 
+  radius, rect.origin.y  +  radius, radius,
                        
- M_PI  /   2 , M_PI,  1 );
    }
    
else  {
        CGContextAddLineToPoint(context, rect.origin.x, rect.origin.y);
        CGContextAddLineToPoint(context, rect.origin.x, rect.origin.y 
+  radius);
    }

    CGContextClosePath(context);
}


@implementation UIImage (Utility)
-  (UIImage  * )roundedRectWith:( float )radius cornerMask:(UIImageRoundedCorner)cornerMask
{
    UIImageView 
* bkImageViewTmp  =  [[[UIImageView alloc] initWithImage:self] autorelease];

    
int  w  =  self.size.width;
    
int  h  =  self.size.height;

    CGColorSpaceRef colorSpace 
=  CGColorSpaceCreateDeviceRGB();
    CGContextRef context 
=  CGBitmapContextCreate(NULL, w, h,  8 ,  4   *  w, colorSpace, kCGImageAlphaPremultipliedFirst);

    CGContextBeginPath(context);
    addRoundedRectToPath(context,bkImageViewTmp.frame, radius, cornerMask);
    CGContextClosePath(context);
    CGContextClip(context);

    CGContextDrawImage(context, CGRectMake(
0 ,  0 , w, h), self.CGImage);

    CGImageRef imageMasked 
=  CGBitmapContextCreateImage(context);
    CGContextRelease(context);
    CGColorSpaceRelease(colorSpace);

    UIImage    
* newImage  =  [UIImage imageWithCGImage:imageMasked];

    CGImageRelease(imageMasked);

    
return  newImage;
}

@end 

 

 实现方法如下:

-  (IBAction)showRectImage
{
    UIImage 
* rectImage  =  [UIImage imageNamed: @" test.jpg " ];
    self.imageView.image 
=  rectImage;
}

-  (IBAction)showRoundImage
{
    UIImage 
* rectImage  =  [UIImage imageNamed: @" test.jpg " ];
    UIImage 
* roundImage  =  [rectImage roundedRectWith: 100
                                          cornerMask:UIImageRoundedCornerBottomLeft
| UIImageRoundedCornerBottomRight | UIImageRoundedCornerTopLeft | UIImageRoundedCornerTopRight];
    self.imageView.image 
=  roundImage;
}


-  (IBAction)show2RoundImage
{
    UIImage 
* rectImage  =  [UIImage imageNamed: @" test.jpg " ];
    UIImage 
* round2Image  =  [rectImage roundedRectWith: 100
                                          cornerMask:UIImageRoundedCornerBottomLeft
| UIImageRoundedCornerBottomRight];
    self.imageView.image 
=  round2Image;

} 

 

对于四个角,用下面的角进行逻辑或的方法。

UIImageRoundedCornerTopRight
UIImageRoundedCornerTopLeft
UIImageRoundedCornerBottomRight

UIImageRoundedCornerBottomLeft 


+ (void)roundedImage:(UIImage *)image

          completion:(void (^)(UIImage *image))completion {

    dispatch_async( dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

        // Begin a new image that will be the new image with the rounded corners

        // (here with the size of an UIImageView)

        UIGraphicsBeginImageContextWithOptions(image.size, NO, image.scale);

        CGRect rect = CGRectMake(0, 0, image.size.width,image.size.height);

        

        // Add a clip before drawing anything, in the shape of an rounded rect

        [[UIBezierPath bezierPathWithRoundedRect:rect

                                    cornerRadius:image.size.width/2] addClip];

        // Draw your image

        [image drawInRect:rect];

        

        // Get the image, here setting the UIImageView image

        UIImage *roundedImage = UIGraphicsGetImageFromCurrentImageContext();

        

        // Lets forget about that we were drawing

        UIGraphicsEndImageContext();

        dispatch_async( dispatch_get_main_queue(), ^{

            if (completion) {

                completion(roundedImage);

            }

        });

    });

}


MOS管热阻的测量方法 实验室内如何测试mos管热阻 阅读详情

相关推荐

ROS2仿真抓取分拣案例,使用myCobot 280机械臂结合ROS2系统搭建机械分拣站

本案例展示了如何利用myCobot 280 urdf模型构建一个对象分类站,并在ROS2 jazzy中完成运动规划。

m0_71627844的博客 2126

iOS UIImage设置圆角

新建UIImage分类如下: @interface UIImage (RoundedRectImage) - (UIImage *)setRoundedCorners:(CGFloat)radius andSize:(CGSize)size; @end #import "UIImage+RoundedRectImage.h" @implementation UIImage (RoundedR...

祝我们都能在鸡零狗碎的生活里,找到自己的快乐~ 1244

【机器人】转动的指数坐标表示心得理解

转动的指数坐标表示心得理解1.前言2.指数坐标表示旋转矩阵3.原理推导4.矩阵对数、矩阵指数 1.前言 最近因为项目需求,又学习了一点机器人学的东西,参考书籍为《现代机器人学》,该书采用指数坐标、旋量的方式来对机器人进行描述和运动学、动力学建模,让我对机器人有了更深的理解,也是弥补DH参数建模复杂的缺陷,虽然DH法只用4个参数,而旋量需要更多,但是它骚啊! 本文是我学习了转动的指数坐标表示的一个心得体会,如有问题请多多包涵。 2.指数坐标表示旋转矩阵 指数坐标可以用来表示求解旋转矩阵,其原理非常简单巧妙,需

要恰饭得嘛 2329

UIImage设置圆角

【代码】UIImage设置圆角。

qq_30252465的博客 575

SV fork join_none & for循环结合使用

fork join_none与循环联用常见问题解决方案

ZhangShuHuai11的博客 880

嵌入式系统实战:DroneCAN协议栈移植与避坑指南

本文详细介绍了在嵌入式系统中移植DroneCAN协议栈的完整流程与实战技巧。内容涵盖移植前的准备工作、内存管理优化、CRC校验实现、多帧数据处理及硬件平台适配等关键环节,并以STM32F4为例提供了具体的移植步骤和避坑指南,帮助开发者高效完成DroneCAN在嵌入式设备上的集成与应用。

solidity8miner的博客 548

通过绘制上下文的方式绘制图片圆角

//通过绘图的方式给图片设置圆角,而view的‘layer.cornerRadius’方法是离屏渲染,很消耗内存,所以可以通过下面的方法给图片设置圆角//为imageView 添加类别,给imageView的图片设置圆角-(void)imageWithCornerRadius:(CGFloat)radius { UIGraphicsBeginImageContextWithOpt

xia5879017的博客 436

电子硬件仿真:设计一个频率范围为10k—50k的带通滤波器

带通滤波器是一种常用的滤波器类型,具有选择特定频率范围内信号的能力,并在该范围内提供一定的增益。它允许通过一定范围内的频率信号,并在该范围内提供一定的增益,同时在该范围之外的频率上提供较高的衰减。这意味着在通带内(10kHz至50kHz),滤波器的增益应为10dB,而在每个十倍频的频率点上,滤波器的增益应降低40dB。设计滤波器:使用滤波器设计工具(如MATLAB、Python的scipy库、Tina软件等),根据选定的滤波器类型(例如巴特沃斯滤波器),中心频率和通带宽度,设计一个4阶带通滤波器。

走向CTO的路上... 579

IOS 将图片转换为圆角图

UIImage+wiRoundedRectImage.h #import <UIKit/UIKit.h> @interface UIImage (wiRoundedRectImage) + (id)createRoundedRectImage:(UIImage*)image size:(CGSize)size radius:(NSInteger)r; ...

weixin_30908103的博客 267

RK3399平台开发系列讲解(外设篇)交换芯片RTL8306M

网络:交换芯片RTL8306M 电路: make menuconfig 配置: 目录:arch/arm64/configs/rk3399_b201_defconfig CONFIG_FIXED_PHY=y 设备树: arch/arm64/boot/dts/rockchip/rk3399-b201-rev1.dts 时钟: Open之后首先校验网卡mac地址是否正确(stmmac_chec...

内核笔记 2392

第四节:Vben Admin登录对接后端getUserInfo接口

上一节,我们完成了/api/auth/login接口的创建,通过login接口,我们完成了登录和Token的生成。但是登陆还是报404返回,发现是Vben Admin又请求了一个/api/getUserInfo接口,本节我们就来分析完成这个接口本节,我们完成了getUserInfo接口,完成了登录操作,成功的进入到工作台页面。

cuiwin的专栏 2846

iOS给UIimage添加圆角的两种方式

众所周知,给图片添加圆角有CALayer的cornerRadius, 比如: 最直接的方法: imgView.layer.cornerRadius1=110; imgView.clipsToBounds = YES; 这事离屏渲染 (off - screen - rendering), 是很消耗性能的;有很多公司面试的时候会问到,你怎么将图片设置圆角,如果你 ...

270

阿里云百炼全解析:一站式大模型开发平台的架构与行业实践

摘要: 阿里云百炼平台通过一站式架构革新大模型开发范式,将传统碎片化工具链整合为统一工作流,实现开发周期从月级到小时级的跃迁。其核心架构包含接入层、引擎层与资源层,关键技术突破包括MCP服务协议、多模态引擎及高性能训练优化。平台提供全生命周期开发支持,从数据准备到模型部署,并通过VPC隔离、数据加密构建企业级安全体系。已在医疗、电力等行业实现显著增效,如阿斯利康药物分析系统准确率提升至95%。未来将向多Agent协同、边缘计算等方向演进,推动AI技术深度融入产业核心。

fudaihb的博客 1990

Swift UIImage扩展

import UIKit // MARK: 颜色转UIImage extension UIImage { public convenience init?(color: UIColor, size: CGSize = CGSize(width: 1.0, height: ...

chuangketong9015的博客 426

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

给UIImage添加生成圆角图片的扩展API:

给UIImage添加生成圆角图片的扩展API: - (UIImage *)hyb_imageWithCornerRadius:(CGFloat)radius {   CGRect rect = (CGRect){0.f, 0.f, self.size};   UIGraphicsBeginImageContextWithOptions(self.size, NO, UIScreen.

小猴子 360

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

UIImage-Categories:iOS 图像处理利器

UIImage-Categories:iOS 图像处理利器 项目基础介绍与编程语言 UIImage-Categories 是一个基于Objective-C编写的强大工具集,专为解决在iOS平台上对UIImage对象进行裁剪和缩放时遇到的局限性而生。这个开源项目由Trevor Harmon最初创建,并由mbcharbonneau维护的一个分支,它针对性地解决了UIImage类在处理图片尺寸调整上的不...

gitblog_00711的博客 574

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

UIImage-Additions 项目推荐

UIImage-Additions 项目推荐 UIImage-Additions Adding utilities to UIImage! 项目地址: https://gitcode.com/gh_mirrors/ui/UIIma...

gitblog_00013的博客 406

推荐项目:UIImage+Additions - 图像处理的利器

推荐项目:UIImage+Additions - 图像处理的利器 项目介绍 如果你在iOS开发中经常遇到为不同颜色和形状调整图像的需求,那么UIImage+Additions将是你的得力助手。这是一个优雅的UIImage类别扩展,它提供了一系列方便的方法,可以让你轻松动态地生成彩色图像,添加圆角,调整阴影,甚至创建渐变色图像,而无需额外设计资源。 项目技术分析 UIImage+Additions基...

gitblog_00034的博客 327

UIImage的扩展方法——裁剪图片和等比列缩放图片-翻转-圆形等

首先创建一个UIImage类别,如下: @interface UIImage(UIImageScale)  -(UIImage*)getSubImage:(CGRect)rect;  -(UIImage*)scaleToSize:(CGSize)size;  @end     @implementation UIImage(UIImageScale)     //

备忘录-IOS知识等 5789

UIImage切圆角 - 优化

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34400525的博客 378

iOS--创建圆角图片的又一方法

UIImage+additions.h #import <UIKit/UIKit.h> @interface UIImage (additions) -(UIImage*)makeRoundCornersWithRadius:(const CGFloat)RADIUS; @end UIImage+additions.m #import "UIImage+additions.h" ...

weixin_33728268的博客 78

修改UIImage大小的正确姿势

本文是一篇英文的部分翻译,如有哪里不准确,欢迎指出。原文地址 更好的改变image大小的方式这一部分描述了改变UIImage对象大小的源代码合集。在功能上,它可能与你在各种网上论坛、博客能够找到的类似,但是它将他们的特性正和到一个独立的、可重用的包,并且提供了几个显著的提升。 * 额外的用于裁剪图片,生成缩略图的一些方法。 * 使用Objective-C的categories实现,易于服用。使用

a376552890的博客 1687

[Swift通天遁地]五、高级扩展-(8)ImageView(图像视图)的各种扩展方法

★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★➤微信公众号:山青咏芝(shanqingyongzhi)➤博客园地址:山青咏芝(https://www.cnblogs.com/strengthen/)➤GitHub地址:https://github.com/strengthen/LeetCode➤原文地址:https://www.cnblogs.com/streng...

weixin_30376509的博客 195

ios 图片裁剪框架_ios UIImage 圆形图片剪切方案

@interfaceUIImage(Resize)//按形状切割图像-(UIImage*)cutImageWithRadius:(int)radius;@end//图片剪切-(UIImage*)cutImageWithRadius:(int)radius{UIGraphicsBeginImageContext(self.size);CGContextRefgc=UIGraphicsG...

weixin_29156401的博客 174
上一篇: iOS应用性能调优的25个建议和技巧
下一篇: iOS 保持界面流畅的技巧
kingcodexl
博客等级 码龄12年 18粉丝 49原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值