UIGraphicsBeginImageContext - 位图上下文
UIGraphicsBeginImageContext
首先,先来认识一个UIGraphicsBeginImageContext,它会创建一个基于位图的上下文(context)(默认创建一个透明的位图上下文),并将其设置为当前上下文。
位图图形上下文UIKit是不会负责创建的,所以需要用户手动创建,并且需要在使用完毕后关闭它。在使用UIKit中系统创建的图形上下文的时候,我们只能在drawRect:方法中使用,由于位图图形上下文是由我们手动创建的,所以可以放到任何方法中调用,此外,这个方法并没有返回值,如果我们要得到我们创建的图形上下文只需要在创建上下文之后、关闭之前调用UIGraphicsGetCurrentContext()方法,此时取得的上下文就是我们自己创建的图形上下文了。
方法声明如下:
void UIGraphicsBeginImageContext(CGSize size);
参数size为新创建的位图上下文的大小。它同时是由UIGraphicsGetImageFromCurrentImageContext函数返回的图形的大小。该函数的功能通UIGraphicsBeginImageContextWithOptions的功能相同,相当于UIGraphicsBeginImageContextWithOptions的opaque的参数为NO,scale因子为1.0.
方法声明如下:
void UIGraphicsBeginImageContextWithOptions(CGSize size, BOOL opaque, CGFloat scale);
size:同UIGraphicsBeginImageContext
opaque:透明开关,如果图形完全不同透明,设置为YES以优化位图的存储。
scale:缩放因子。
demo1:根据颜色生成一张图片
static func colorImage( size : CGSize, color : UIColor ) -> UIImage {
// 开启一个图形上下文
UIGraphicsBeginImageContext(size)
// 获取到这个上下文
let context = UIGraphicsGetCurrentContext()
// 设置颜色
context?.setFillColor(color.cgColor)
// 绘制
context?.fill(CGRect(x: 0, y: 0, width: size.width, height: size.height))
// 获取到这张图片
let image = UIGraphicsGetImageFromCurrentImageContext()
// 关闭
UIGraphicsEndImageContext()
return image!
}
demo2:获取屏幕截图
// 获取屏幕的截图
static func screenImage() -> UIImage { // 获取到window
let window = UIApplication.shared.delegate?.window as? UIWindow // 开启一个图形上下文
UIGraphicsBeginImageContext(UIScreen.main.bounds.size) // 系统截屏方法
window?.drawHierarchy(in: UIScreen.main.bounds, afterScreenUpdates: true) // 获取到这张图片
let image = UIGraphicsGetImageFromCurrentImageContext() // 关闭
UIGraphicsEndImageContext() return image! }
demo3:根据view生成图片
// 根据view生成图片
static func viewImage(view : UIView) -> UIImage { // 开启一个图形上下文
UIGraphicsBeginImageContext(view.frame.size) // 获取到这个上下文
let context = UIGraphicsGetCurrentContext() // 渲染内容到上下文
view.layer.render(in: context!) // 获取到这张图片
let image = UIGraphicsGetImageFromCurrentImageContext() // 关闭
UIGraphicsEndImageContext() return image! }
demo4:直接将图片切割圆角
// 切割图片生成圆角
func cicleImage() -> UIImage {
// 开启一个图形上下文
UIGraphicsBeginImageContext(size) // 获取到这个上下文
let context = UIGraphicsGetCurrentContext() // 设置圆形
context?.addEllipse(in: CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height)) // 裁剪
context?.clip() // 重新绘制
self.draw(in: CGRect(x: 0, y: 0, width: self.size.width, height: self.size.height)) // 获取到这张图片
let image = UIGraphicsGetImageFromCurrentImageContext() // 关闭
UIGraphicsEndImageContext() return image! }
UIGraphicsBeginImageContext - 位图上下文的更多相关文章
- Quartz-2D绘图之图形上下文详解
上一篇文章大概描述了下Quartz里面大体所包含的东西,但是对具体的细节实现以及如何调用相应API却没有讲.这篇文章就先讲讲图形上下文(Graphics Context)的具体操作. 所谓Graphi ...
- iPhone之Quartz 2D系列--图形上下文(2)(Graphics Contexts)
以下几遍关于Quartz 2D博文都是转载自:http://www.cocoachina.com/bbs/u.php?action=topic&uid=38018 iPhone之Quartz ...
- Quartz 2D - 图形上下文(Graphics Contexts)
一个Graphics Context表示一个绘制目标.它包含绘制系统用于完成绘制指令的绘制参数和设备相关信息.Graphics Context定义了基本的绘制属性,如颜色.裁减区域.线条宽度和样式信息 ...
- Quartz 2D编程指南(2) - 图形上下文
一个Graphics Context表示一个绘制目标.它包含绘制系统用于完成绘制指令的绘制参数和设备相关信息.Graphics Context定义了基本的绘制属性,如颜色.裁减区域.线条宽度和样式信息 ...
- Quartz 2D编程指南(2)图形上下文(Graphics Contexts)
Graphics Contexts 一个Graphics Context表示一个绘制目标(也能够理解为图形上下文).它包括绘制系统用于完毕绘制指令的绘制參数和设备相关信息.Graphics ...
- iOS开发系列--打造自己的“美图秀秀”
--绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz ...
- iOS常见用户头像的圆形图片裁剪常见的几种方法
在开发中,基本上APP的用户头像的处理都需要把用户所上传的方形图片,处理为圆形图片.在这里就总结三种常见的处理圆形图片的方法. 1.使用位图上下文 2.使用UIView的layer进行处理 3.使用r ...
- 完美解决scrollView 截屏图片模糊
UIGraphicsBeginImageContext 首先说明一下UIGraphicsBeginImageContextWithOptions 和UIGraphicsBeginImageCont ...
- iOS给UIimage添加圆角的两种方式
众所周知,给图片添加圆角有CALayer的cornerRadius, 比如: 最直接的方法: imgView.layer.cornerRadius1=110; imgView.clipsToBou ...
随机推荐
- Java IO 之 BIO、NIO、AIO
1.BIO.NIO.AIO解释 Java BIO : 同步并阻塞 (Blocking IO) 一个连接一个线程 即客户端有连接请求时服务器端就需要启动一个线程进行处理,如果这个连接不做任何事情会造成不 ...
- pyqt5 在qt designer后以弹窗的方式连接多个UI图形界面
当我们通过pyqt开发时,eric6为我们提供了一个方便的工具:图形化的绘制UI工具--qt designer. 我们可以通过它开发多个UI,然后利用信号-槽工具,将功能代码附着在上面.也可以将多个界 ...
- WPF转换器之通用转换器
WPF中的转换器是一个非常好的数据类型转换解决方案,实用和强大, 它的作用是将源数据转换为WPF自身需要的类型,对数据实体没有侵略性,会在项目工程中频繁使用.所以掌握转换器是WPF开发的必备技能. 我 ...
- 设计模式--工厂方法模式(Factory method pattern)及应用
面向对象的好处: 通过封装,继承,多态把程序的耦合度降低. 用设计模式可以使程序更加灵活,容易修改,且易于复用. 1. 工厂方法模式 Define an interface for creating ...
- (转)流量加速插件 FinalSpeed介绍及一键安装教程
原文章连接:https://blog.kuoruan.com/82.html 1 介绍 官方介绍:FinalSpeed是高速双边加速软件,可加速所有基于tcp协议的网络服务,在高丢包和高延迟环境下,仍 ...
- 导航栏使用UIButton自定义返回按钮的图片
- (void)viewDidLoad { UIButton *backItem = [UIButton buttonWithType:UIButtonTypeCustom]; UIBarButton ...
- java线程数过高原因分析
作者:鹿丸不会多项式 出处:http://www.cnblogs.com/hechao123 转载请先与我联系. 一.问题描述 前阵子我们因为B机房故障,将所有的流量切到了A机房,在经历了推送+ ...
- jqthumb.js缩略图插件-让缩略图正常显示而不变形
插件介绍 项目中有图片的时候,有的宽大于高,有的宽小于高,尤其在做图片列表的时候,经常发现缩略图会有变形的.我们怎样来解决这一问题呢. 方法一:用photoshop来处理缩略图.小的项目还可以,大的项 ...
- 学生成绩管理系统——C语言实现
一.功能实现: 0.浏览学生信息 1.输入学生信息 2.增加学生信息 3.修改学生信息 4.删除学生信息 5.按学号查询 6.按班级查询 7.按姓名查询 8.按课堂名称查询 9.按总分高低排序 10. ...
- hdu 6045 Is Derek lying?(思维推导)
Problem Description Derek and Alfia are good friends.Derek is Chinese,and Alfia is Austrian.This sum ...