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

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

iOS之实现图片裁剪的几种方式相关推荐

  1. Python:实现图片裁剪的两种方式——Pillow和OpenCV

    原文:https://blog.csdn.net/hfutdog/article/details/82351549 在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还 ...

  2. Python图片裁剪的两种方式——Pillow和OpenCV

    本文参考Python图片裁剪的两种方式--Pillow和OpenCV并进行了一些更新 感谢作者:hfutdog 在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还有一 ...

  3. python opencv 裁剪图片_Python图片裁剪的两种方式——Pillow和OpenCV

    在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还有一种利用了OpenCV.两种方式都需要简单的几行代码,这可能也就是现在Python那么流行的原因吧. OpenCV ...

  4. Python实现图片裁剪的两种方式——Pillow和OpenCV

    在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还有一种利用了OpenCV.两种方式都需要简单的几行代码,这可能也就是现在Python那么流行的原因吧. 首先,我们有 ...

  5. iOS中对图片拉伸的四种方式

    1. UIImageView整体拉伸 方式一是通过设置容器UIImageView中图片的显示模式:UIImageView-contentMode,使容器内的图片按照需要的拉伸方式在容器中显示. typ ...

  6. Android点击图片随机,android 设置图片随机出现-两种方式

    android 设置图片随机出现-两种方式, 第一种方式:得到图片对应的Drawable实例,通过setImageDrawable(drawable)实现 //ImageView对应的id ivBg ...

  7. 实现精灵图片绝对定位的三种方式(伪)

    精灵图片绝对定位的三种方式(伪) 有强迫症的我为此困扰了一上午,说白了还是自己实力不够,想法总被局限. 实现结果如上图中间的为最终满意样品 整体用列表写的` 左1: 把整体看成一个背景图加上面文字: ...

  8. android 设置图片随机出现-两种方式

    android 设置图片随机出现-两种方式, 第一种方式:得到图片对应的Drawable实例,通过setImageDrawable(drawable)实现 //ImageView对应的idivBg = ...

  9. ios 将矩形图片裁剪成圆形图片

    在ios中将一个正方形的图片裁剪成圆形的图片是一件非常容易的事情, 直接设置 imageView.layer.cornerRadius 这个属性, 再设置 imageView.clipsToBound ...

最新文章

  1. 跟着老司机玩转Node自定义命令行
  2. 使用Hexo在Github搭建静态博客
  3. java date只保留年月日_Java日期时间API系列14-----Jdk8中日期API类,日期计算1,获取年月日时分秒等...
  4. ERP与SCM之区别
  5. java php serialize_PHP serialize 和 JSON 解析与区别
  6. Java静态方法和实例方法 java中的数组作为形参传入
  7. Atitit webdav应用场景 提升效率 小型数据管理 目录 1.1. 显示datalist 1 1.2. Ajax填充数据 1 1.3. 编辑数据 2 1.1.显示datalist
  8. 二叉树的层序遍历 二叉树
  9. MTK 驱动开发---Memory 移植
  10. IOS越狱--修复Cydia闪退(或打不开)的办法
  11. [译] Oracle Database 21c 中的 SQL 集合运算符增强功能(EXCEPT、EXCEPT ALL、MINUS ALL、INTERSECT ALL)
  12. tcpdump输出内容分析
  13. 谷歌宣布搜索引擎多个新 AI 功能,听歌识曲 15 秒完成匹配
  14. 带你几分钟学会MarkDown基本语法
  15. 【流媒体服务】安装推流转码工具(三):【1】下载安装ffmpeg推流转码工具
  16. quartus II 过期怎么办?
  17. 计算机音乐谱大全好汉歌,好汉歌民谣简谱
  18. 前缀和数组(java)
  19. firefox打印记录一下
  20. 程序员电脑的心声:我想休息!

热门文章

  1. 嵌入式 arm 中抓包:tcpdump移植
  2. 【PAT甲级 - C++题解】1095 Cars on Campus
  3. 装机必备软件测试大乐,9款电脑装机必备软件,一个比一个好用!
  4. 使用火蜘蛛采集器Firespider采集天猫商品数据并上传到微店呢
  5. 06_MySQL笔记-数据类型-字段属性-存储引擎-字符集-创建新表-数据库建模
  6. 第30天-WEB 漏洞-RCE 代码及命令执行漏洞全解
  7. MATLAB转C语言的步骤与解决方案
  8. css中div阴影,圆形边角等的使用和案例
  9. 雷军辞去总裁兼CEO
  10. Android活动生命周期