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 - 位图上下文的更多相关文章

  1. Quartz-2D绘图之图形上下文详解

    上一篇文章大概描述了下Quartz里面大体所包含的东西,但是对具体的细节实现以及如何调用相应API却没有讲.这篇文章就先讲讲图形上下文(Graphics Context)的具体操作. 所谓Graphi ...

  2. iPhone之Quartz 2D系列--图形上下文(2)(Graphics Contexts)

    以下几遍关于Quartz 2D博文都是转载自:http://www.cocoachina.com/bbs/u.php?action=topic&uid=38018 iPhone之Quartz ...

  3. Quartz 2D - 图形上下文(Graphics Contexts)

    一个Graphics Context表示一个绘制目标.它包含绘制系统用于完成绘制指令的绘制参数和设备相关信息.Graphics Context定义了基本的绘制属性,如颜色.裁减区域.线条宽度和样式信息 ...

  4. Quartz 2D编程指南(2) - 图形上下文

    一个Graphics Context表示一个绘制目标.它包含绘制系统用于完成绘制指令的绘制参数和设备相关信息.Graphics Context定义了基本的绘制属性,如颜色.裁减区域.线条宽度和样式信息 ...

  5. Quartz 2D编程指南(2)图形上下文(Graphics Contexts)

    Graphics Contexts       一个Graphics Context表示一个绘制目标(也能够理解为图形上下文).它包括绘制系统用于完毕绘制指令的绘制參数和设备相关信息.Graphics ...

  6. iOS开发系列--打造自己的“美图秀秀”

    --绘图与滤镜全面解析 概述 在iOS中可以很容易的开发出绚丽的界面效果,一方面得益于成功系统的设计,另一方面得益于它强大的开发框架.今天我们将围绕iOS中两大图形.图像绘图框架进行介绍:Quartz ...

  7. iOS常见用户头像的圆形图片裁剪常见的几种方法

    在开发中,基本上APP的用户头像的处理都需要把用户所上传的方形图片,处理为圆形图片.在这里就总结三种常见的处理圆形图片的方法. 1.使用位图上下文 2.使用UIView的layer进行处理 3.使用r ...

  8. 完美解决scrollView 截屏图片模糊

    UIGraphicsBeginImageContext   首先说明一下UIGraphicsBeginImageContextWithOptions 和UIGraphicsBeginImageCont ...

  9. iOS给UIimage添加圆角的两种方式

    众所周知,给图片添加圆角有CALayer的cornerRadius, 比如: 最直接的方法: imgView.layer.cornerRadius1=110;   imgView.clipsToBou ...

随机推荐

  1. Jmeter之处理session、cookie以及如何做关联

    具体描述问题之前,我们先了解下session.cookie session.cookie的概念 1.session是放在服务器上的,过期与否取决于服务期的设定,cookie是存在客户端的,过去与否可以 ...

  2. Log4Net(一):快速入门

    概览 Log4Net是Apache Log4J框架在.NET平台上的实现,它是一个帮助开发者将日志信息以多种方式(数据库.控制台.文件等)输出的开源工具. 为什么要使用日志记录 提供应用程序运行时状态 ...

  3. Hadoop的配置过程(虚拟机中的伪分布模式)

    1引言 hadoop如今已经成为大数据处理中不可缺少的关键技术,在如今大数据爆炸的时代,hadoop给我们处理海量数据提供了强有力的技术支撑.因此,了解hadoop的原理与应用方法是必要的技术知识. ...

  4. (转)Spring 的 init-method 和 destory-method

    背景:今天在项目中看到spring中bean在初始化和注销时候的方法定义,之前没有用过这种方式,在此记录下,方便后期查看! 关于在spring 容器初始化 bean 和销毁前所做的操作定义方式有三种: ...

  5. Linux shell for while 循环

    1.数字段形式for i in {1..10}do   echo $idone 2.详细列出(字符且项数不多)for File in 1 2 3 4 5 do     echo $File done ...

  6. ML(1)--概念理解

    机器是如何模拟人来学习的? 人:  observations===>learning===>skill 人从出生开始经过大量的观察(也可能经过身边的的指导)进行学习然后得到相应的技能(比如 ...

  7. vue项目优化之按需加载组件-使用webpack require.ensure

    require-ensure和require-amd的区别: require-amd 说明: 同AMD规范的require函数,使用时传递一个模块数组和回调函数,模块都被下载下来且都被执行后才执行回调 ...

  8. java_==和equal方法

    java测试两个变量是否相等有两种方式: 一种是利用"=="运算符 值和对象的判断 一种是利用equals()方法 只是值的判断 1.如果两个变量是基本类型变量,且都是数值类型(不 ...

  9. KNN算法--python实现

    邻近算法 或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代 ...

  10. NYOJ--122--Triangular Sums

    Triangular Sums 时间限制:3000 ms  |  内存限制:65535 KB 难度:2   描述 The nth Triangular number, T(n) = 1 + - + n ...