iOS开发:关于图片的美白技术
第一次接触图像处理的知识是在贴吧找的资料。感谢那些在贴吧打广告的“客服老师”,开始直播的时候竟然给你发抖动窗口,我那叫一个感动啊,于是乎我就把他删了。
图片的美白其实就是操作这个图片上的所有像素点,获得像素点的R、G、B、A的值然后获取到的值进行一定数目的增量。稍微懂点图像学朋友也都知道,三原色 red、green、blue在图像学中的取值范围是0-255。越靠近0,图像就越黑,等于0的时候就是纯黑色;越靠近255,图像就越白,等于255的时候就是白色。图片的美白就是利用的这个原理。


接下来开始介绍源代码。
第一步:将UIImage转换为CGImage
因为美白用到的是CoreGraphic框架下的类,所以需要转换图片类型。在这里需要获取图片的大小以便开辟内存空间。

第二部:创建颜色空间
在这一步,我们需要创建一个颜色空间。颜色空间分为两种:彩色空间和灰色空间。因为图片是彩色的所以需要创建彩色的颜色空间,如下图所示:

第三步:创建图片上下文,保存图片信息
需要注意的是,在这里创建的是位图(Bitmap)信息(以为需要操作像素点),何为位图?位图是Windows标准格式图形文件,它将图像定义为由点(像素)组成,每个点可以由多种色彩表示,包括2、4、8、16、24和32位色彩。例如,一幅1024×768分辨率的32位真彩图片,其所占存储字节数为:1024×768×32/(8*1024)=3072KB。创建位图使用的是CoreGraphics框架中的CGBitmapContextCreate方法,该方法参数较多:

(1)参数一:数据源
何为数据源?数据源就是一个指针,指向存储该图片内存区域首地址的指针。在这里创建一个指针指向首该图片的首个像素。一个像素是由R、G、B、A四个分量总成的一个分量代表8位,所以一个分量也就是一个像素的大小是32位。所以在这里创建的是32位指针。

(2)参数二:图像宽度
CGImage图像的宽度
(3)参数三:图像高度
CGImage图像的高度
(4)参数四:每一个分量(像素)的大小
每个分量代表8位,所以这个参数填8
(5)参数五:每一行占用内存的大小
通俗一点也就是计算每一行的像素点,用得到的图像宽度 x 4就是每一行的像素点。
(6)参数六:颜色空间
就是在第二步创建的彩色空间
(7)当前你的位图信息
由于下面在获取每个像素点RGBA值的时候将alpha通道放在了最后,所以这里的参数选择kCGImageAlphaPremultipliedLast和kCGImageByteOrder32Big。
第四步:根据上面创建的信息开始画图

有了图片的信息,现在需要做的就是将图片画出,画出的效果自然就是美白了。这里是最核心的算法。通过双重的for循环得到图像上的每一个像素点。

第六步:将CGImage对象转换成UIImage对象

上面得到的位图信息创建新的位图,再将CGImage对象转换成UIImage对象返回。
第七步:释放内存

CoreGraphics框架中的对象自动释放池释放不了所以这里需要手动释放,避免内存泄露。