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. 一步一步学Vue(四)

    接上篇.上篇中给出了代码框架,没有具体实现,这一篇会对上篇定义的几个组件进行分别介绍和完善: 1.TodoContainer组件 TodoContainer组件,用来组织其它组件,这是react中推荐 ...

  2. Linux通过shell执行自动化部署

    背景 通过shell判断是否存在补丁更新,进行自动化的部署 代码 #!/bin/sh #Edit:何彦霆 #version: beta #执行环境初始化 source /hxspace/product ...

  3. 关于frameset的一些小总结

    如果我们在一个页面需要由多个子页面一同组成,那么我们可以通过frameset标签来嵌套别的页面 例如 这样的页面布局的思路是: 1,先将页面分为上下两部分也就是 A B 2,再将B部分分为左右两部分 ...

  4. (转)如何将 Excel 文件导入到 Navicat for MySQL 数据库

    场景:工作中需要统计一段时间的加班时长,人工统计太过麻烦,就想到使用程序实现来统计 1 如何将 Excel 文件导入到 Navicat for MySQL 数据库 Navicat for MySQL  ...

  5. 学习笔记TF032:实现Google Inception Net

    Google Inception Net,ILSVRC 2014比赛第一名.控制计算量.参数量,分类性能非常好.V1,top-5错误率6.67%,22层,15亿次浮点运算,500万参数(AlexNet ...

  6. 正则替换内容中图片的src

    string test = "<IMG src=\"http://www.baidu.com/upload/2009_11/09112110144808.jpg\" ...

  7. 浅谈js分页的几种方法

    一个项目中必然会遇到分页这种需求的,分页可以使数据加载更合理,也让页面显示更美观,更有层次感!那么js分页到底如何实现呢?下面我就来讲一下三种循序渐进的方法 1.自己纯手写分页 更深入的去理解分页的意 ...

  8. CentOS上javaweb开发环境搭建

    CentOS上javaweb开发环境搭建 安装jdk yum list java* yum install java-1.7.0-openjdk* -y java -version 安装tomcat ...

  9. Python 爬虫抓取代理IP,并检测联通性

    帮朋友抓了一些代理IP,并根据测试联的通性,放在了不通的文件夹下.特将源码分享 注意: 1,环境Python3.5 2,安装BeautifulSoup4  requests 代码如下: 1 2 3 4 ...

  10. LAP+mysql-主从+redis

    Redis是一个开源的,内存中的数据结构存储系统,他可以用作数据库,缓存和消息中间介.支持多种类型数据库结构,如字符串(strings),散列(hashes),列表(lists),集合(sets),有 ...