iOS中的CGBitmapContext

前言

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

GitHub-AFBitMap

6.Demo2:可变形的Image

GitHub-AFBitMap

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 《激荡三十年》是吴晓波先生的代表作,描述了从1988年到2008年这三十年间中国大地上发生的波澜壮阔的伟大变革。...
    正方的星星阅读 2,524评论 0 1
  • 假如有一块地,你会用来做什么?这是在接触南明教育后常常想的问题。 上一届,兴致冲冲地在网上买了一批种子,每个孩子发...
    海水淡悠悠阅读 882评论 0 1

友情链接更多精彩内容