▲点击上方“CocoaChina”关注即可免费学习iOS开发
前言
女孩子都喜欢用美图工具进行图片美容,近来无事时,特意为某人写了个自定义图片滤镜生成器,安装到手机即可完成自定义滤镜渲染照片。app独一无二,虽简亦繁。
JH定律: 魔镜:最漂亮的女人是你老婆 魔镜:程序员不是木头人
核心技术
图片滤镜核心技术的基本思路如下:
核心技术流程
具体流程
1、创建一个图像处理工具类
注:该类实例包括一个图像处理方法,该方法在传入原始图像和一个颜色矩阵后生成一个处理好的图像。
@inte**ce JHFeilterManager : NSObject
@property (nonatomic,copy)imageBlock imageBLOCK;
- (UIImage *)createImageWithImage:(UIImage *)inImage colorMatrix:(const float *)f;
2、获取图像的每个像素点的RGBA值数组
注:该c方法返回一个指针,该指针指向一个数组,数组中的每四个元素都是图像上的一个像素点的RGBA的数值(0-255),用无符号的char是因为它正好的取值范围就是0-255
static unsigned char *RequestImagePixelData(UIImage * inImage){
CGImageRef img = [inImage CGImage];
CGSize size = [inImage size];
//使用上面的函数创建上下文
CGContextRef cgctx = CreateRGBABitmapContex(img);
CGRect rect = {{0,0},{size.width,size.height}};
//将目标图像绘制到指定的上下文,实际为上下文内的bitmapData。
CGContextDrawImage(cgctx, rect, img);
unsigned char *data = CGBitmapContextGetData(cgctx);
//释放上面的函数创建的上下文
CGContextRelease(cgctx);
cgctx = NULL;
return data;
}
3、调整一个像素点的RGBA值
注:如下方法传入参数为数值指针和一个颜色矩阵,通过颜色矩阵调整指针指向地址存储的数值
static void changeRGB(int *red,int* green,int*blue,int*alpha ,const float *f){
int redV = *red;
int greenV = *green;
int blueV = *blue;
int alphaV = *alpha;
//色值重新计算 计算规则如下
*red = f[0] * redV f[1]*greenV f[2]*blueV f[3] * alphaV f[4];
*green = f[5] * redV f[6]*greenV f[7]*blueV f[8] * alphaV f[9];
*blue = f[10] * redV f[11]*greenV f[12]*blueV f[11] * alphaV f[14];
*alpha = f[15] * redV f[16]*greenV f[17]*blueV f[18] * alphaV f[19];
*red |