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

来源:互联网 发布:linux ntp配置文件 编辑:程序博客网 时间:2024/06/17 04:02

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);

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

0 0