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 ...
随机推荐
- [bzoj1805][SCOI2005]骑士精神 [启发式搜索]
Description 在一个5×5的棋盘上有12个白色的骑士和12个黑色的骑士, 且有一个空位.在任何时候一个骑士都能按照骑士的走法(它可以走到和它横坐标相差为1,纵坐标相差为2或者横坐标相差为2, ...
- 第一章:火狐浏览器 : 环境配置: FireFox 版本38 + jdk 7 + selenium 2.53.6 + selenum-version 2.48.2
配置一套完整的 selenium + Java + Firefox38 环境: 1. 火狐浏览器的版本 : 38 2. JDK 安装 1.7 版本的 3. 安装 Python 的版本是 2.7 4. ...
- C# 创建、部署和调用WebService的简单示例
废话不多说,下面开始创建一个简单的webservice的例子.这里我用的是Visual Studio 2015开发工具. 首先创建一个空的Web应用程序. 然后鼠标右键点击项目,选择 添加>新建 ...
- jquery validate bootstrap 错误样式配置
$().ready(function () { $("#commentForm").validate({ errorPlacement: function (error, elem ...
- 内核对象kobject和sysfs(4)——kset分析
内核对象kobject和sysfs(4)--kset分析 从狭义上来说,kset就是kobj的一个再封装而已.在封装之后,提供了针对kset之下所有kobj统一管理的一些方法. 我们还是从结构说起: ...
- javascript中的闭包(Closure)的学习
闭包(closure)是Javascript语言的一个难点,也是它的特色,很多高级应用都要依靠闭包实现. 下面是我在网上通过学习阮一峰老师的笔记,感觉总结很不错,特记录于此. 一.变量的作用域 要理解 ...
- 分布式事务,EventBus 解决方案:CAP【中文文档】
前言 很多同学想对CAP的机制以及用法等想有一个详细的了解,所以花了将近两周时间写了这份中文的CAP文档,对 CAP 还不知道的同学可以先看一下这篇文章. 本文档为 CAP 文献(Wiki),本文献同 ...
- Unity 粒子系统 特效 移除屏幕外面后再移回来 不会显示问题
今天遇到的问题 勾选Particle System组件中的Sub Emitters属性 如图
- 【head first python】2.共享你的代码 函数模块
#coding:utf-8 #注释代码! #添加两个注释,一个描述模块,一个描述函数 '''这是nester.py模块,提供了一个名为print_lol()的函数, 这个函数的作用是打印列表,其中可能 ...
- 使用JAXP进行XM解析(基于DOM)
最近在做微信开发需要各种解析各种xml,基本用JAXP 解析的 JAXP 开发包是J2SE的一部分,它由javax.xml.org.w3c.dom .org.xml.sax 包及其子包组成. 在 ja ...