计算机视觉AI智能识别

iOS开发:关于图片的美白技术

2017-04-03  本文已影响18人  787ea54e5cc5

       第一次接触图像处理的知识是在贴吧找的资料。感谢那些在贴吧打广告的“客服老师”,开始直播的时候竟然给你发抖动窗口,我那叫一个感动啊,于是乎我就把他删了。

        图片的美白其实就是操作这个图片上的所有像素点,获得像素点的R、G、B、A的值然后获取到的值进行一定数目的增量。稍微懂点图像学朋友也都知道,三原色 red、green、blue在图像学中的取值范围是0-255。越靠近0,图像就越黑,等于0的时候就是纯黑色;越靠近255,图像就越白,等于255的时候就是白色。图片的美白就是利用的这个原理。

图一、VC的基本设计 图二、图片的美白效果

接下来开始介绍源代码。

第一步:将UIImage转换为CGImage

     因为美白用到的是CoreGraphic框架下的类,所以需要转换图片类型。在这里需要获取图片的大小以便开辟内存空间。

图三、获取图片的宽和高

第二部:创建颜色空间

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

图四、创建颜色空间(彩色)

第三步:创建图片上下文,保存图片信息

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

图五、CGBitmapContextCreate方法

(1)参数一:数据源

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

图六、创建32位像素指针

(2)参数二:图像宽度

        CGImage图像的宽度

(3)参数三:图像高度

         CGImage图像的高度

(4)参数四:每一个分量(像素)的大小

       每个分量代表8位,所以这个参数填8

(5)参数五:每一行占用内存的大小

      通俗一点也就是计算每一行的像素点,用得到的图像宽度 x 4就是每一行的像素点。

(6)参数六:颜色空间

       就是在第二步创建的彩色空间

(7)当前你的位图信息

       由于下面在获取每个像素点RGBA值的时候将alpha通道放在了最后,所以这里的参数选择kCGImageAlphaPremultipliedLast和kCGImageByteOrder32Big。

第四步:根据上面创建的信息开始画图

图七、将图片画在控制器上

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

图八、通过for循环得到每一个像素点改变其RGBA的分量值最后再将像素点重新组合起来形成新的图像

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

图九、将CGImage对象转换成UIImage对象

上面得到的位图信息创建新的位图,再将CGImage对象转换成UIImage对象返回。

第七步:释放内存

图十、释放相关内存

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

demo的地址:https://github.com/myNameIsZuiCai/openCV-

上一篇下一篇

猜你喜欢

热点阅读