iOS之实现图片裁剪的几种方式

本文介绍了在iOS中实现图片裁剪的三种方法:1) 使用CGImageCreateWithImageInRect函数,需要注意像素级别的处理;2) 使用UIGraphicsBeginImageContextWithOptions函数,创建位图上下文进行裁剪,可以设置上下文的不透明度和缩放比例;3) 通过调整UIImageView.layer.contentsRect属性来裁剪显示的部分。内容适合iOS开发者,特别是对图片处理感兴趣的读者。
部署运行你感兴趣的模型镜像

iOS之实现图片裁剪的几种方式

1.使用CGImageCreateWithImageInRect函数

  • CGImageCreateWithImageInRect函数是属于Core Graphics Framework框架的,而Core Graphics Framework是一套基于C语言的框架,基于C语言的特性,它是跨平台的。因此使用此函数会使用到较多的C变量,要与OC中的对象进行转换。此函数有两个参数(CGImageRef _Nullable image, CGRect rect),第一个参数传入一个CGImageRef类型的结构体,第二参数传入CGRect类型的结构体,指出需要裁剪的区域。有一个注意点: 因为对于苹果开发者,都是基于屏幕上的点的位置进行开发的,而使用的图片又有@1x,@2x,@3x不同分辨率之分,本来开发者是不需要关心这些的。但是因为使用到了基于C语言的跨平台的框架,此函数对图片的操作都是基于像素的。需要注意这一点,否则裁剪出来的图片可能不是你想要的效果。
  • 以下是实现方法
UIImage *image = [UIImage imageNamed:@"小新"]; //一张你自己的图片,无论是网络上加载的还是本地的

CGImageRef partOneImageRef = CGImageCreateWithImageInRect(image.CGImage, CGRectMake(0, 0, image.size.width, image.size.height * 0.5)); // 实现把图片裁剪成平分的上下两部分,通过UIImage对象的.CGImage,可以把OC对象的UIImage转换成CGImageRef结构体。

self.topImageView.image = [UIImage imageWithCGImage:topImageRef]; //使用UIImage的类方法实现加载CGImageRef类型的图片

截取图片上半部

2.使用UIGraphicsBeginImageContextWithOptions函数

  • 此函数也是属于Core Graphics Framework框架的,其实在iOS中大多数涉及到图形操作的,都是基于Core Graphics Framework框架,此框架使用了Quartz作为绘图引擎(想要了解更多关于iOS绘图方面的知识,点击iOS绘图详解)。此函数是用来开启位图上下文的(更多的还有PDF图形上下文,窗口上下文,图层上下文,打印上下文),之后的所有操作都是在此上下文中进行的。此函数传入三个参数(CGSize size, BOOL opaque, CGFloat scale),第一个参数CGSize即开启的位图上下文的大小。第二个参数opaque即开启的位图山下文的不透明度,NO代表透明,YES代表不透明,一般是用透明上下文。第三个参数scale缩放比例,0代表不缩放,一般不缩放。最后生成的图片是跟上下文一样大的,这是跟第一种方法不同之处。
  • 以下是实现方法:
UIImage *image = [UIImage imageNamed:@"小新"]; //一张你自己的图片,无论是网络上加载的还是本地的

UIGraphicsBeginImageContextWithOptions(self.topImageView.bounds.size, NO, 0); //开启位图上下文,使用用来显示裁剪完的图片的控件的尺寸作为上下文的尺寸,好处是可以防止裁剪的图片大于控件的尺寸,造成图片拉伸

UIBezierPath *clipRectPath = [UIBezierPath bezierPathWithRect:CGRectMake(0, 0, image.size.width, image.size.height * 0.5)]; //使用贝瑟尔路径来描述裁剪区域,也可以使用CGMutablePathRef来描述路径,其实贝瑟尔路径底层也是用CGMutablePathRef实现的,只是贝瑟尔更面向对象。

[clipRectPath addClip]; //添加裁剪区域,此步骤必须在图片绘制到上下文之前做

[image drawInRect:CGRectMake(0, 0, image.size.width, image.size.height)];  //把待裁剪的图片绘制到上下文中

self.topImageView.image = UIGraphicsGetImageFromCurrentImageContext(); //从上下文中获取裁剪完的图片

UIGraphicsEndImageContext(); //操作完之后需要关闭上下文

3.通过操作layer层的contentsRect属性

  • 在iOS中控制之所以能显示,都是因为有layer层,layer层是专门用来显示的。而UIImageView控件的图片是添加到layer的contents属性中的。所以操作layer.contentsRect属性就能控制那些部分用来显示。此属性传递一个CGRect,CGRect的四个参数的范围是0~1,这点需要注意。
  • 实现如下:
self.topImageView.layer.contentsRect = CGRectMake(0, 0, 1, 0.5);

第一次写个人博客,写的不好,大家多多批评:)

您可能感兴趣的与本文相关的镜像

TensorFlow-v2.9

TensorFlow-v2.9

TensorFlow

TensorFlow 是由Google Brain 团队开发的开源机器学习框架,广泛应用于深度学习研究和生产环境。 它提供了一个灵活的平台,用于构建和训练各种机器学习模型

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值