iOS开发:实现图片的打码效果
马赛克(mosaic)作为人类进步路上的一大绊脚石,被人们所深恶痛绝。作为阻止人类进步小能手,我今天就给大家普及一下关于如何在iOS平台实现图片打码效果的。
![](https://img.haomeiwen.com/i4999080/19199a0078454347.gif)
本文主要介绍的是使用iOS平台自身的API去实现图片打码效果的,没有使用openCV。
一、将UIImage转换为CGImage,并获取图片的大小
![](https://img.haomeiwen.com/i4999080/6777d5a836d52a2e.png)
二、获取图片的颜色空间
这一步通俗的来讲就是我需要知道我要操作的图片是彩色的还是灰色的,颜色空间也是创建图片上下文所需要的参数之一,所以这里必须获取。
![](https://img.haomeiwen.com/i4999080/b084477792f42a40.png)
三、创建图片上下文
创建图片上下文是为了下一步的绘制图片,图片上下文是绘制图片函数的一个参数。
![](https://img.haomeiwen.com/i4999080/bf5142ea9bd23fa4.png)
四、更具图形上下文绘制图片
![](https://img.haomeiwen.com/i4999080/241e06588c109c2d.png)
五、更具上下文获取图片(位图)
将CGImage转换为可以操作像素的位图,方便打码。
![](https://img.haomeiwen.com/i4999080/234b88618dbd3e6d.png)
六、打码算法
下面的斜线为代码部分,关于打码算法的详细情况,我会在下一篇文章中介绍一下。
//第六:进行打码过程
intcurrentIndex=0, preindex=0;
intlevel=20;
//定义像素点数组,用于保存像素点的值
unsignedcharpixcels[4]={0};
for(inti=0; i
for(intj=0; j
//计算当前的位置
currentIndex = i*width+j;
//获取马赛克第一列第一行的像素值
if(i%level==0) {
//马赛克矩形第一行
if(j%level==0) {
//马赛克第一行第一列
//要想获取第一个像素的值,要使用C语言的数据拷贝
/*
参数一:目标数据(拷贝到哪里)
参数二:数据源(从哪里拷贝)
参数三:拷贝多少内容
*/
memcpy(pixcels, imageData+4*currentIndex,4);
}else{
//其他列
//将第一个像素点的值复制给其他像素(在同一行的)
//实现:C函数的拷贝
//计算上一行马赛克的位置
memcpy(imageData+4*currentIndex, pixcels,4);
}
}else{
//马赛克矩形的其他行
//相对于上一行
preindex=(i-1)*width+j;
memcpy(imageData+4*currentIndex, imageData+4*preindex,4);
}
}
}
七、获取图片数据集合
![](https://img.haomeiwen.com/i4999080/900bc1c9f5d25e00.png)
![](https://img.haomeiwen.com/i4999080/12a4b05a24801899.png)
八、创建马赛克图片并显示在屏幕上
将重新计算过的imageData重新显示在图片上就是最终要的马赛克图片。
![](https://img.haomeiwen.com/i4999080/18d1ea0e22bd42c2.png)
九、释放内存
所有的CoreGraphics框架中的类所创建的对象要手动释放掉。
![](https://img.haomeiwen.com/i4999080/21cfa9773ff18cab.png)
demo连接地址:https://github.com/myNameIsZuiCai/masaicImage/tree/master