iOS學習筆記–圖片美白(一) – iPhone手機開發 iPhone軟體開發教學課程

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;
}

發佈留言