欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS学习笔记--图片美白(一)

程序员文章站 2022-04-12 20:04:35
ios学习笔记--图片美白。在ios开发中,图片美白通常的方法有自定义方法和第三方框架实现,下面就自己在学习的过程中用到的方法做个整理。 通过自定义方法实现 个人认为图片美白实际上就是对图片的像素点...

ios学习笔记--图片美白。在ios开发中,图片美白通常的方法有自定义方法和第三方框架实现,下面就自己在学习的过程中用到的方法做个整理。

通过自定义方法实现
个人认为图片美白实际上就是对图片的像素点进行修改,可以分为一下几个步骤:
第一步:拿到图片;
第二步:创建颜色空间;
第三步:创建图片上下文;
第四步:绘制图片;
第五步:对像素点进行修改;
第六步:创建image对象;
第七步:释放内存。
下面上代码:

//定义宏用来获取argb分量值
#define mask8(x) ((x) & 0xff)
#define r(x) ( mask8(x) )
#define g(x) ( mask8(x >>8 ) )
#define b(x) ( mask8(x >>16) )
#define a(x) ( mask8(x >>24) )
#define rgbamake(r, g, b, a) ( mask8(r) | mask8(g) << 8 | mask8(b) << 16 | mask8(a) << 24)
+(uiimage *)picturethewhitening:(uiimage *)image
{
    int lumi = 10;
    //第一步:拿到图片
    cgimageref imageref = [image cgimage];
    nsuinteger width = cgimagegetwidth(imageref);
    nsuinteger height = cgimagegetheight(imageref);

    //第二步:创建颜色空间
    cgcolorspaceref colorspaceref = cgcolorspacecreatedevicergb();

    uint32 * inputpixels = (uint32*)calloc(width * height, sizeof(uint32));

    //第三步:创建图片上下文
   cgcontextref contextref =  cgbitmapcontextcreate(inputpixels, width, height, 8, width * 4, colorspaceref, kcgimagealphapremultipliedlast | kcgbitmapbyteorder32big);

    //第四步:绘制图片
    cgcontextdrawimage(contextref, cgrectmake(0, 0, width, height), imageref);

    //第五步:对像素点进行修改
    for (int i = 0; i < height; i++)
    {
        for(int j = 0;j < width; j++)
        {
            uint32 * currentpixels = inputpixels + i * width + j;

            uint32 color = * currentpixels;
            uint32 colora,colorr,colorg,colorb;

            colorr = r(color);
            colorr = colorr + lumi;
            colorr = colorr > 255 ? 255 : colorr;

            colorg = g(color);
            colorg = colorg + lumi;
            colorg = colorg > 255 ? 255 : colorg;

            colorb = b(color);
            colorb = colorb + lumi;
            colorb = colorb > 255 ? 255 : colorb;

            colora = a(color);
            *currentpixels = rgbamake(colorr, colorg, colorb, colora);
        }
    }

    //第六步:创建image对象
    cgimageref newimageref = cgbitmapcontextcreateimage(contextref);
    uiimage * newimage = [uiimage imagewithcgimage:newimageref];

    //第七步:释放内存
    cgcolorspacerelease(colorspaceref);
    cgcontextrelease(contextref);
    cgimagerelease(newimageref);
    free(inputpixels);

    return newimage;
}