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));
self.topImageView.image = [UIImage imageWithCGImage:topImageRef];
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)]
[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)
第一次写个人博客,写的不好,大家多多批评:)