美文网首页计算机视觉AI智能识别
iOS开发:关于图片的美白技术

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

作者: 787ea54e5cc5 | 来源:发表于2017-04-03 14:25 被阅读18次

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

            图片的美白其实就是操作这个图片上的所有像素点,获得像素点的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-

    相关文章

      网友评论

        本文标题:iOS开发:关于图片的美白技术

        本文链接:https://www.haomeiwen.com/subject/smznottx.html