前言
女孩子都喜欢用美图工具进行图片美容,近来无事时,特意为某人写了个自定义图片滤镜生成器,安装到手机即可完成自定义滤镜渲染照片。app独一无二,虽简亦繁。
核心技术图片滤镜核心技术的基本思路如下:
在以下方法中,不要立刻释放malloc方法生成的bitmapData内存空间指针,(可能有的朋友觉得已经把内存空间地址给了位图上下文就可以立马释放掉了,但是实际上,由于位图上下文在后来的图像渲染时,仍然需要这一块内存,因此不能在此处立马释放掉内存,之前拜读的几篇博客索性就不释放内存了,因此会导致内存泄漏,处理一些高清图像时,开题报告,手机内存会轻易飙升到1G以上,而导致程序挂掉)不然会导致位图上下文的内容数据不能正常存在而导致图片生成失败,在这里需要一个全局内存指针来指向它,并且在合适的时候释放内存。
该方法中需要传入一个原始图片信息和一个颜色矩阵,颜色矩阵决定了图像的渲染效果,因此不同的滤镜效果可以通过设置不同的颜色矩阵进行转换,如果您不了解颜色矩阵,点击这里进行了解- (UIImage *)createImageWithImage:(UIImage *)inImage colorMatrix:(const float *)f{ /* 图片位图像素值数组 */ unsigned char *imgPixel = RequestImagePixelData(inImage); CGImageRef inImageRef = [inImage CGImage]; /* 获取像素的横向和纵向个数 */ long w = CGImageGetWidth(inImageRef); long h = CGImageGetHeight(inImageRef); int wOff = 0; int pixOff = 0; /* 遍历修改位图像素值 */ for (long y = 0; y<h; y++) { pixOff = wOff; for (long x = 0; x<w; x++) { int red = (unsigned char)imgPixel[pixOff]; int green = (unsigned char)imgPixel[pixOff+1]; int blue = (unsigned char)imgPixel[pixOff +2]; int alpha = (unsigned char)imgPixel[pixOff +3]; changeRGB(&red, &green, &blue, &alpha,f); imgPixel[pixOff] = red; imgPixel[pixOff + 1] = green; imgPixel[pixOff + 2] = blue; imgPixel[pixOff + 3] = alpha; pixOff += 4; } wOff += w * 4 ; } NSInteger dataLength = w * h * 4; //创建要输出的图像的相关参数 CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, imgPixel, dataLength, NULL); if (!provider) { NSLog(@'创建输出图像相关参数失败!'); }else{ //每个像素点每个颜色的空间大小 单位为bit int bitsPerComponent = 8; //每个像素的空间大小 单位为bit int bitsPerPixel = 32; //每一行的颜色点的个数 每个像素有4个颜色点 每行有2个点 ItemCount bytesPerRow = 4 * w; //创建RBGA色彩空间 CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB(); //位图的组成部分信息 CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault; //图像渲染参数 使用默认值 CGColorRenderingIntent rederingIntent = kCGRenderingIntentDefault; //创建要输出的图像,参数依次为 宽、高、每个像素点的大小、每行占用空间大小、颜色空间、位图信息、相关输出参数 CGImageRef imageRef = CGImageCreate(w, h,bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpaceRef, bitmapInfo, provider,NULL, NO, rederingIntent); if (!imageRef) { NSLog(@'创建输出图像失败'); }else{ UIImage *my_image = [UIImage imageWithCGImage:imageRef]; CFRelease(imageRef); CGColorSpaceRelease(colorSpaceRef); CGDataProviderRelease(provider); if (_imageBLOCK) { _imageBLOCK(my_image); } NSData *data = UIImageJPEGRepresentation(my_image, 1.0); //在此释放位图空间 free(bitmap); return [UIImage imageWithData:data]; } } return nil; } 5、UI搭建#p#分页标题#e#UI界面非常简单,就是一张大图、20个颜色矩阵的信息录入框和两个按钮组成,代码就不过多赘述了,有需要的话可以到这里,喜欢的话不防给个star哦。
成果展示成型的demo就是这个样子喽!