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);
第一次写个人博客,写的不好,大家多多批评:)
iOS之实现图片裁剪的几种方式相关推荐
- Python:实现图片裁剪的两种方式——Pillow和OpenCV
原文:https://blog.csdn.net/hfutdog/article/details/82351549 在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还 ...
- Python图片裁剪的两种方式——Pillow和OpenCV
本文参考Python图片裁剪的两种方式--Pillow和OpenCV并进行了一些更新 感谢作者:hfutdog 在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还有一 ...
- python opencv 裁剪图片_Python图片裁剪的两种方式——Pillow和OpenCV
在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还有一种利用了OpenCV.两种方式都需要简单的几行代码,这可能也就是现在Python那么流行的原因吧. OpenCV ...
- Python实现图片裁剪的两种方式——Pillow和OpenCV
在这篇文章里我们聊一下Python实现图片裁剪的两种方式,一种利用了Pillow,还有一种利用了OpenCV.两种方式都需要简单的几行代码,这可能也就是现在Python那么流行的原因吧. 首先,我们有 ...
- iOS中对图片拉伸的四种方式
1. UIImageView整体拉伸 方式一是通过设置容器UIImageView中图片的显示模式:UIImageView-contentMode,使容器内的图片按照需要的拉伸方式在容器中显示. typ ...
- Android点击图片随机,android 设置图片随机出现-两种方式
android 设置图片随机出现-两种方式, 第一种方式:得到图片对应的Drawable实例,通过setImageDrawable(drawable)实现 //ImageView对应的id ivBg ...
- 实现精灵图片绝对定位的三种方式(伪)
精灵图片绝对定位的三种方式(伪) 有强迫症的我为此困扰了一上午,说白了还是自己实力不够,想法总被局限. 实现结果如上图中间的为最终满意样品 整体用列表写的` 左1: 把整体看成一个背景图加上面文字: ...
- android 设置图片随机出现-两种方式
android 设置图片随机出现-两种方式, 第一种方式:得到图片对应的Drawable实例,通过setImageDrawable(drawable)实现 //ImageView对应的idivBg = ...
- ios 将矩形图片裁剪成圆形图片
在ios中将一个正方形的图片裁剪成圆形的图片是一件非常容易的事情, 直接设置 imageView.layer.cornerRadius 这个属性, 再设置 imageView.clipsToBound ...
最新文章
- 跟着老司机玩转Node自定义命令行
- 使用Hexo在Github搭建静态博客
- java date只保留年月日_Java日期时间API系列14-----Jdk8中日期API类,日期计算1,获取年月日时分秒等...
- ERP与SCM之区别
- java php serialize_PHP serialize 和 JSON 解析与区别
- Java静态方法和实例方法 java中的数组作为形参传入
- Atitit webdav应用场景 提升效率 小型数据管理 目录 1.1. 显示datalist	1 1.2. Ajax填充数据	1 1.3. 编辑数据	2 1.1.显示datalist
- 二叉树的层序遍历 二叉树
- MTK 驱动开发---Memory 移植
- IOS越狱--修复Cydia闪退(或打不开)的办法
- [译] Oracle Database 21c 中的 SQL 集合运算符增强功能(EXCEPT、EXCEPT ALL、MINUS ALL、INTERSECT ALL)
- tcpdump输出内容分析
- 谷歌宣布搜索引擎多个新 AI 功能,听歌识曲 15 秒完成匹配
- 带你几分钟学会MarkDown基本语法
- 【流媒体服务】安装推流转码工具(三):【1】下载安装ffmpeg推流转码工具
- quartus II 过期怎么办?
- 计算机音乐谱大全好汉歌,好汉歌民谣简谱
- 前缀和数组(java)
- firefox打印记录一下
- 程序员电脑的心声:我想休息!