前言
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.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];
修改第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