iOS精品文章iOS UI相关Learn iOS

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:取色器

GitHub-AFBitMap

取色器效果图

6.Demo2:可变形的Image

GitHub-AFBitMap
  1.当然这个Demo如果使用OpenGL来做效果和性能会更好
2.也可以使用CIFilter的CIPerspectiveTransform来做

可变形的Image

参考文章

从图片中的一点取色(Cocoa-China)
Swift中的指针操作及使用(SCDN)
Swift与C语言交互编程(Swift中文网)

上一篇 下一篇

猜你喜欢

热点阅读