月圆之夜,紫禁之巅,一剑西来,天外飞仙。

0%

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

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

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

1
2
3
4
5
6
7
//定义宏用来获取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)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
+(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;
}

仅供学习使用,如有错误请见谅!