您的位置:首页 > 移动开发 > IOS开发

ios 简单滤镜效果

2016-01-21 16:11 507 查看
#import "ImageUtil.h"

#include <sys/time.h>

#include <math.h>

#include <stdio.h>

#include <string.h>

// 1返回一个使用RGBA通道的位图上下文

static CGContextRef CreateRGBABitmapContext (CGImageRef inImage)

{

CGContextRef context = NULL;

CGColorSpaceRef colorSpace;

void *bitmapData; //内存空间的指针,该内存空间的大小等于图像使用RGB通道所占用的字节数。

int bitmapByteCount;

int bitmapBytesPerRow;

size_t pixelsWide = CGImageGetWidth(inImage); //获取横向的像素点的个数

size_t pixelsHigh = CGImageGetHeight(inImage);

bitmapBytesPerRow = (pixelsWide * 4); //每一行的像素点占用的字节数,每个像素点的ARGB四个通道各占8个bit(0-255)的空间

bitmapByteCount = (bitmapBytesPerRow * pixelsHigh); //计算整张图占用的字节数

colorSpace = CGColorSpaceCreateDeviceRGB();//创建依赖于设备的RGB通道

//分配足够容纳图片字节数的内存空间

bitmapData = malloc( bitmapByteCount );

//创建CoreGraphic的图形上下文,该上下文描述了bitmaData指向的内存空间需要绘制的图像的一些绘制参数

context = CGBitmapContextCreate (bitmapData,

pixelsWide,

pixelsHigh,

8,

bitmapBytesPerRow,

colorSpace,

kCGImageAlphaPremultipliedLast);

//Core Foundation中通过含有Create、Alloc的方法名字创建的指针,需要使用CFRelease()函数释放

CGColorSpaceRelease( colorSpace );

return context;

}

// 2返回一个指针,该指针指向一个数组,数组中的每四个元素都是图像上的一个像素点的RGBA的数值(0-255),用无符号的char是因为它正好的取值范围就是0-255

static unsigned char *RequestImagePixelData(UIImage *inImage)

{

CGImageRef img = [inImage CGImage];

CGSize size = [inImage size];

//使用上面的函数创建上下文

CGContextRef cgctx = CreateRGBABitmapContext(img);

CGRect rect = {{0,0},{size.width,
size.height}};

//将目标图像绘制到指定的上下文,实际为上下文内的bitmapData。

CGContextDrawImage(cgctx, rect, img);

unsigned char *data
= CGBitmapContextGetData (cgctx);

//释放上面的函数创建的上下文

CGContextRelease(cgctx);

return data;

}

//3修改RGB的值

static void changeRGBA(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[0+5]*redV+f[1+5]*greenV+f[2+5]*blueV+f[3+5]*alphaV+f[4+5];

*blue=f[0+5*2]*redV+f[1+5*2]*greenV+f[2+5*2]*blueV+f[3+5*2]*alphaV+f[4+5*2];

*alpha=f[0+5*3]*redV+f[1+5*3]*greenV+f[2+5*3]*blueV+f[3+5*3]*alphaV+f[4+5*3];

if (*red>255) {

*red=255;

}

if(*red<0){

*red=0;

}

if (*green>255) {

*green=255;

}

if (*green<0) {

*green=0;

}

if (*blue>255) {

*blue=255;

}

if (*blue<0) {

*blue=0;

}

if (*alpha>255) {

*alpha=255;

}

if (*alpha<0) {

*alpha=0;

}

}

#pragma mark -

@implementation ImageUtil

#pragma mark -

+ (UIImage*)processImage:(UIImage*)inImage withColorMatrix:(const float*)
f

{

unsigned char *imgPixel = RequestImagePixelData(inImage);

CGImageRef inImageRef = [inImage CGImage];

GLuint w = CGImageGetWidth(inImageRef);

GLuint h = CGImageGetHeight(inImageRef);

int wOff = 0;

int pixOff = 0;

//双层循环按照长宽的像素个数迭代每个像素点

for(GLuint y = 0;y<
h;y++)

{

pixOff = wOff;

for (GLuint 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];

changeRGBA(&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);

// prep the ingredients

int bitsPerComponent = 8;

int bitsPerPixel = 32;

int bytesPerRow = 4 * w;

CGColorSpaceRef colorSpaceRef = CGColorSpaceCreateDeviceRGB();

CGBitmapInfo bitmapInfo = kCGBitmapByteOrderDefault;

CGColorRenderingIntent renderingIntent = kCGRenderingIntentDefault;

//创建要输出的图像

CGImageRef imageRef = CGImageCreate(w, h,

bitsPerComponent,

bitsPerPixel,

bytesPerRow,

colorSpaceRef,

bitmapInfo,

provider,

NULL, NO,
renderingIntent);

UIImage *my_Image = [UIImage imageWithCGImage:imageRef];

CFRelease(imageRef);

CGColorSpaceRelease(colorSpaceRef);

CGDataProviderRelease(provider);

return my_Image;

}

//-----------颜色处理-----

#ifndef ImageProcessing_ColorMatrix_h

#define ImageProcessing_ColorMatrix_h

//ColorMatrix From Android

//lomo

const float colormatrix_lomo[] = {

1.7f, 0.1f, 0.1f, 0,
-73.1f,

0, 1.7f, 0.1f, 0,
-73.1f,

0, 0.1f, 1.6f, 0,
-73.1f,

0, 0, 0, 1.0f, 0 };

//黑白

const float colormatrix_heibai[] = {

0.8f, 1.6f, 0.2f, 0,
-163.9f,

0.8f, 1.6f, 0.2f, 0,
-163.9f,

0.8f, 1.6f, 0.2f, 0,
-163.9f,

0, 0, 0, 1.0f, 0 };

//旧化

const float colormatrix_huajiu[] = {

0.2f,0.5f, 0.1f, 0, 40.8f,

0.2f, 0.5f, 0.1f, 0, 40.8f,

0.2f,0.5f, 0.1f, 0, 40.8f,

0, 0, 0, 1, 0 };

//哥特

const float colormatrix_gete[] = {

1.9f,-0.3f,
-0.2f, 0,-87.0f,

-0.2f, 1.7f,
-0.1f, 0, -87.0f,

-0.1f,-0.6f, 2.0f, 0,
-87.0f,

0, 0, 0, 1.0f, 0 };

//锐色

const float colormatrix_ruise[] = {

4.8f,-1.0f,
-0.1f, 0,-388.4f,

-0.5f,4.4f,
-0.1f, 0,-388.4f,

-0.5f,-1.0f, 5.2f, 0,-388.4f,

0, 0, 0, 1.0f, 0 };

//淡雅

const float colormatrix_danya[] = {

0.6f,0.3f, 0.1f, 0,73.3f,

0.2f,0.7f, 0.1f, 0,73.3f,

0.2f,0.3f, 0.4f, 0,73.3f,

0, 0, 0, 1.0f, 0 };

//酒红

const float colormatrix_jiuhong[] = {

1.2f,0.0f, 0.0f, 0.0f,0.0f,

0.0f,0.9f, 0.0f, 0.0f,0.0f,

0.0f,0.0f, 0.8f, 0.0f,0.0f,

0, 0, 0, 1.0f, 0 };

//清宁

const float colormatrix_qingning[] = {

0.9f, 0, 0, 0, 0,

0, 1.1f,0, 0, 0,

0, 0, 0.9f, 0, 0,

0, 0, 0, 1.0f, 0 };

//浪漫

const float colormatrix_langman[] = {

0.9f, 0, 0, 0, 63.0f,

0, 0.9f,0, 0, 63.0f,

0, 0, 0.9f, 0, 63.0f,

0, 0, 0, 1.0f, 0 };

//光晕

const float colormatrix_guangyun[] = {

0.9f, 0, 0, 0, 64.9f,

0, 0.9f,0, 0, 64.9f,

0, 0, 0.9f, 0, 64.9f,

0, 0, 0, 1.0f, 0 };

//蓝调

const float colormatrix_landiao[] = {

2.1f, -1.4f, 0.6f, 0.0f,
-31.0f,

-0.3f, 2.0f,
-0.3f, 0.0f, -31.0f,

-1.1f, -0.2f, 2.6f, 0.0f,
-31.0f,

0.0f, 0.0f, 0.0f, 1.0f, 0.0f

};

//梦幻

const float colormatrix_menghuan[] = {

0.8f, 0.3f, 0.1f, 0.0f, 46.5f,

0.1f, 0.9f, 0.0f, 0.0f, 46.5f,

0.1f, 0.3f, 0.7f, 0.0f, 46.5f,

0.0f, 0.0f, 0.0f, 1.0f, 0.0f

};

//夜色

const float colormatrix_yese[] = {

1.0f, 0.0f, 0.0f, 0.0f,
-66.6f,

0.0f, 1.1f, 0.0f, 0.0f,
-66.6f,

0.0f, 0.0f, 1.0f, 0.0f,
-66.6f,

0.0f, 0.0f, 0.0f, 1.0f, 0.0f

};

#endif

-------调用-----

#ifndef ImageProcessing_ColorMatrix_h

#define ImageProcessing_ColorMatrix_h

//ColorMatrix From Android

//lomo

const float colormatrix_lomo[] = {

1.7f, 0.1f, 0.1f, 0,
-73.1f,

0, 1.7f, 0.1f, 0,
-73.1f,

0, 0.1f, 1.6f, 0,
-73.1f,

0, 0, 0, 1.0f, 0 };

//黑白

const float colormatrix_heibai[] = {

0.8f, 1.6f, 0.2f, 0,
-163.9f,

0.8f, 1.6f, 0.2f, 0,
-163.9f,

0.8f, 1.6f, 0.2f, 0,
-163.9f,

0, 0, 0, 1.0f, 0 };

//旧化

const float colormatrix_huajiu[] = {

0.2f,0.5f, 0.1f, 0, 40.8f,

0.2f, 0.5f, 0.1f, 0, 40.8f,

0.2f,0.5f, 0.1f, 0, 40.8f,

0, 0, 0, 1, 0 };

//哥特

const float colormatrix_gete[] = {

1.9f,-0.3f,
-0.2f, 0,-87.0f,

-0.2f, 1.7f,
-0.1f, 0, -87.0f,

-0.1f,-0.6f, 2.0f, 0,
-87.0f,

0, 0, 0, 1.0f, 0 };

//锐色

const float colormatrix_ruise[] = {

4.8f,-1.0f,
-0.1f, 0,-388.4f,

-0.5f,4.4f,
-0.1f, 0,-388.4f,

-0.5f,-1.0f, 5.2f, 0,-388.4f,

0, 0, 0, 1.0f, 0 };

//淡雅

const float colormatrix_danya[] = {

0.6f,0.3f, 0.1f, 0,73.3f,

0.2f,0.7f, 0.1f, 0,73.3f,

0.2f,0.3f, 0.4f, 0,73.3f,

0, 0, 0, 1.0f, 0 };

//酒红

const float colormatrix_jiuhong[] = {

1.2f,0.0f, 0.0f, 0.0f,0.0f,

0.0f,0.9f, 0.0f, 0.0f,0.0f,

0.0f,0.0f, 0.8f, 0.0f,0.0f,

0, 0, 0, 1.0f, 0 };

//清宁

const float colormatrix_qingning[] = {

0.9f, 0, 0, 0, 0,

0, 1.1f,0, 0, 0,

0, 0, 0.9f, 0, 0,

0, 0, 0, 1.0f, 0 };

//浪漫

const float colormatrix_langman[] = {

0.9f, 0, 0, 0, 63.0f,

0, 0.9f,0, 0, 63.0f,

0, 0, 0.9f, 0, 63.0f,

0, 0, 0, 1.0f, 0 };

//光晕

const float colormatrix_guangyun[] = {

0.9f, 0, 0, 0, 64.9f,

0, 0.9f,0, 0, 64.9f,

0, 0, 0.9f, 0, 64.9f,

0, 0, 0, 1.0f, 0 };

//蓝调

const float colormatrix_landiao[] = {

2.1f, -1.4f, 0.6f, 0.0f,
-31.0f,

-0.3f, 2.0f,
-0.3f, 0.0f, -31.0f,

-1.1f, -0.2f, 2.6f, 0.0f,
-31.0f,

0.0f, 0.0f, 0.0f, 1.0f, 0.0f

};

//梦幻

const float colormatrix_menghuan[] = {

0.8f, 0.3f, 0.1f, 0.0f, 46.5f,

0.1f, 0.9f, 0.0f, 0.0f, 46.5f,

0.1f, 0.3f, 0.7f, 0.0f, 46.5f,

0.0f, 0.0f, 0.0f, 1.0f, 0.0f

};

//夜色

const float colormatrix_yese[] = {

1.0f, 0.0f, 0.0f, 0.0f,
-66.6f,

0.0f, 1.1f, 0.0f, 0.0f,
-66.6f,

0.0f, 0.0f, 1.0f, 0.0f,
-66.6f,

0.0f, 0.0f, 0.0f, 1.0f, 0.0f

};

#endif

#ifndef ImageProcessing_ColorMatrix_h

#define ImageProcessing_ColorMatrix_h

//ColorMatrix From Android

//lomo

const float colormatrix_lomo[] = {

1.7f, 0.1f, 0.1f, 0,
-73.1f,

0, 1.7f, 0.1f, 0,
-73.1f,

0, 0.1f, 1.6f, 0,
-73.1f,

0, 0, 0, 1.0f, 0 };

//黑白

const float colormatrix_heibai[] = {

0.8f, 1.6f, 0.2f, 0,
-163.9f,

0.8f, 1.6f, 0.2f, 0,
-163.9f,

0.8f, 1.6f, 0.2f, 0,
-163.9f,

0, 0, 0, 1.0f, 0 };

//旧化

const float colormatrix_huajiu[] = {

0.2f,0.5f, 0.1f, 0, 40.8f,

0.2f, 0.5f, 0.1f, 0, 40.8f,

0.2f,0.5f, 0.1f, 0, 40.8f,

0, 0, 0, 1, 0 };

//哥特

const float colormatrix_gete[] = {

1.9f,-0.3f,
-0.2f, 0,-87.0f,

-0.2f, 1.7f,
-0.1f, 0, -87.0f,

-0.1f,-0.6f, 2.0f, 0,
-87.0f,

0, 0, 0, 1.0f, 0 };

//锐色

const float colormatrix_ruise[] = {

4.8f,-1.0f,
-0.1f, 0,-388.4f,

-0.5f,4.4f,
-0.1f, 0,-388.4f,

-0.5f,-1.0f, 5.2f, 0,-388.4f,

0, 0, 0, 1.0f, 0 };

//淡雅

const float colormatrix_danya[] = {

0.6f,0.3f, 0.1f, 0,73.3f,

0.2f,0.7f, 0.1f, 0,73.3f,

0.2f,0.3f, 0.4f, 0,73.3f,

0, 0, 0, 1.0f, 0 };

//酒红

const float colormatrix_jiuhong[] = {

1.2f,0.0f, 0.0f, 0.0f,0.0f,

0.0f,0.9f, 0.0f, 0.0f,0.0f,

0.0f,0.0f, 0.8f, 0.0f,0.0f,

0, 0, 0, 1.0f, 0 };

//清宁

const float colormatrix_qingning[] = {

0.9f, 0, 0, 0, 0,

0, 1.1f,0, 0, 0,

0, 0, 0.9f, 0, 0,

0, 0, 0, 1.0f, 0 };

//浪漫

const float colormatrix_langman[] = {

0.9f, 0, 0, 0, 63.0f,

0, 0.9f,0, 0, 63.0f,

0, 0, 0.9f, 0, 63.0f,

0, 0, 0, 1.0f, 0 };

//光晕

const float colormatrix_guangyun[] = {

0.9f, 0, 0, 0, 64.9f,

0, 0.9f,0, 0, 64.9f,

0, 0, 0.9f, 0, 64.9f,

0, 0, 0, 1.0f, 0 };

//蓝调

const float colormatrix_landiao[] = {

2.1f, -1.4f, 0.6f, 0.0f,
-31.0f,

-0.3f, 2.0f,
-0.3f, 0.0f, -31.0f,

-1.1f, -0.2f, 2.6f, 0.0f,
-31.0f,

0.0f, 0.0f, 0.0f, 1.0f, 0.0f

};

//梦幻

const float colormatrix_menghuan[] = {

0.8f, 0.3f, 0.1f, 0.0f, 46.5f,

0.1f, 0.9f, 0.0f, 0.0f, 46.5f,

0.1f, 0.3f, 0.7f, 0.0f, 46.5f,

0.0f, 0.0f, 0.0f, 1.0f, 0.0f

};

//夜色

const float colormatrix_yese[] = {

1.0f, 0.0f, 0.0f, 0.0f,
-66.6f,

0.0f, 1.1f, 0.0f, 0.0f,
-66.6f,

0.0f, 0.0f, 1.0f, 0.0f,
-66.6f,

0.0f, 0.0f, 0.0f, 1.0f, 0.0f

};

#endif

----调用-----

outImage = [ImageUtil processImage:_tempImage withColorMatrix:colormatrix_landiao];
此时 outImage 就是经过渲染后的图片了,你可以把它放在画布上显示了

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: