iOS中的CGBitmapContext
2016-03-08 本文已影响2683人
AfryMask
前言
BitmapContext虽然在日常的开发中并不普遍使用,但是在图像处理方面却非常的灵活易用(不依赖第三方库的情况下)。
此文旨在为大家提供一个通过Bitmap处理图像的思路,不足之处还望大神指正。
1.什么是BitmapContext
首先,我们根据图片创建一个BitmapContext,把一张图片绘制到这个BitmapContext上。这时你可以把图片看成是由很多个彩色的点组成的。
这样就类似于一张Excel表格。每个单元格里边有四个float元素,用来存放4个通道:透明度、红、绿、蓝。
每个像素点包含的信息
2.创建
let imgContext = CGBitmapContextCreate(data, width, height, bitsPerComponent, bytesPerRow, space, bitmapInfo)
data: 创建BitmapContext所需的内存空间,由malloc创建
width: 图片的宽度
height: 图片的高度
bitsPerComponent: data中的每个数据所占的字节数
bytesPerRow: 图片每行的位数 = 图片列数*4(因为每个点有4个通道)
space: 颜色区间
bitmapInfo: bitmap类型,一般选择PremultipliedFirst(ARGB)
3.数据的读取&修改
(这一节的swift与oc写法区别较大,所以分开写)
读取首位置指针(swift需强转指针类型)
--swift--
let newImgData = unsafeBitCast(CGBitmapContextGetData(imgContext), UnsafeMutablePointer<CUnsignedChar>.self)
---oc---
unsigned char* data = CGBitmapContextGetData(imgContext);
**读取第n个点的内容 **
--swift--
let alpha = (newImgData + 4*n ).memory
let red = (newImgData + 4*n +1).memory
let green = (newImgData + 4*n +2).memory
let blue = (newImgData + 4*n +3).memory
---oc---
int alpha = newImgData[4*n];
int red = newImgData[4*n+1];
int green = newImgData[4*n+2];
int blue = newImgData[4*n+3];
修改第n个点的内容(0~255)
--swift--
(newImgData + 4*n ).memory = 0
(newImgData + 4*n + 1).memory = 0
(newImgData + 4*n + 2).memory = 0
(newImgData + 4*n + 3).memory = 0
---oc---
newImgData[4*n ] = 0;
newImgData[4*n + 1] = 0;
newImgData[4*n + 2] = 0;
newImgData[4*n + 3] = 0;
4.生成图片
let outImage = CGBitmapContextCreateImage(shapeContext)
5.Demo1:取色器
取色器效果图6.Demo2:可变形的Image
GitHub-AFBitMap
1.当然这个Demo如果使用OpenGL来做效果和性能会更好
2.也可以使用CIFilter的CIPerspectiveTransform来做
参考文章
从图片中的一点取色(Cocoa-China)
Swift中的指针操作及使用(SCDN)
Swift与C语言交互编程(Swift中文网)