ios 简单滤镜效果

#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  就是经过渲染后的图片了,你可以把它放在画布上显示了

时间: 2024-09-15 12:13:43

ios 简单滤镜效果的相关文章

iOS简单易用的标签列表界面

iOS简单易用的标签列表界面 Demo效果: Demo演示: 1.使用cocoapods引入YZTagListView,或者直接拖入YZTagListView文件夹到项目中 2.导入YZTagListView.h头文件 1 #import "YZTagList.h" 3.创建YZTagListView控件 1 2 3   YZTagList *tagList = [[YZTagList alloc] init];   tagList.backgroundColor = [UIColor

IOS简单的登陆界面

主要需要注意的几个问题: 1.导入图片方式最好用文件导入 代码: 在ViewController.m文件中 2.UILable常用属性 @property(nonatomic,copy)   NSString           *text; //设置文本内容 @property(nonatomic,retain) UIFont             *font; //设置字体 @property(nonatomic,retain) UIColor            *textColor;

iOS 简单实用的一些宏定义

#define WDWBaseURL @"http://192.168.1.1/"  //字符串 #define TOWERTabBarItemTitleOffset UIOffsetMake (0, -3) //点 #define WDWFontColor3d3d3d  [UIColor colorWithRed:61/255.0f  green:61/255.0f  blue:61/255.0f alpha:1]//颜色 #define WDWRedColo [UIColor co

iOS --- 通过CPU实现的简单滤镜效果

iOS中使用CPU实现滤镜效果的原理很简单, 即将图片转换成像素数据, 然后对每一个像素进行相应的滤镜效果计算, 然后重新得到过滤后的图片. CPU滤镜效果代码如下: 头文件 // CPUImageFilterUtil.h #import <Foundation/Foundation.h> #import <UIKit/UIKit.h> #import <OpenGLES/ES1/gl.h> #import <OpenGLES/ES1/glext.h> //

iOS --- 使用GPUImage实现的简单滤镜效果

GPUImage 是一个基于 GPU 图像和视频处理的开源 iOS 框架.由于使用 GPU 来处理图像和视频,所以速度非常快. 除了速度上的优势,GPUImage 还提供了很多很棒的图像处理滤镜,但有时候这些基本功能仍然无法满足实际开发中的需求,GPUImage 还支持自定义滤镜. 简单滤镜 GPUImageSepiaFilter *filter = [[GPUImageSepiaFilter alloc] init]; _filteredImage = [filter imageByFilte

iOS简单的手写汉字识别

简介 前一阵在班讯通上边加了一个小的功能:根据拼音提示写出汉字,提交之后软件会打出分数,其界面如下: 下面简单介绍一下第一个版本识别算法的实现: 记录汉字录入轨迹 iOS中UIView视图继承了UIResponder类,该类中的四个方法是我们需要调用的: -(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event; -(void)touchesMoved:(NSSet *)touches withEvent:(UIEvent *

iOS 简单获取当前地理坐标

iOS 获取当前地理坐标        iOS获取当前地理坐标,很简单几句代码,但是如果刚开始不懂,做起来也会也会出现一些问题. 1.导入定位需要用到的库:CoreLocation.framwork .如果要显示地图,就要导入 MapKit.framwork . 2.在info.plist里加入两行 NSLocationWhenInUseUsageDescription  当应用需要时候定位 NSLocationAlwaysUsageDescription   始终使用地位(这行如果不加,那么启

iOS简单runtime封装fmdb的使用

学习了iOS有一段时间了,使用到fmdb操作数据库的时候感觉有很多重复性的工作要做,查询数据库时面向对象性感觉很差,一个查询只能针对一个Model,经过了解发现了runtime的使用可以解决这一问题. 使用fmdb的时候相信有过这样的经历查询某个model时: NSString *sql = @"select * from myFmdb"; FMResultSet *set = [self.database executeQuery:sql]; while (set.next) { i

iOS 简单音乐播放器 界面搭建

如图搭建一个音乐播放器界面,具备以下几个简单功能: 1,界面协调,整洁. 2,点击播放,控制进度条. 3.三收藏歌曲,点击收藏,心形收藏标志颜色加深. 4,左右按钮,切换歌曲图片和标题. 5,点击中间图片,隐藏所有按钮,仅显示蓝色背景. 设计的整体思路: 1.在搭建界面的时候,为了整洁和方便后续的功能的添加,需要将整个的界面划分为几个部分: ①:最上面的一行包括:一个返回按钮.一个歌曲名称.一个收藏按钮: ②:第二行:一个slider控件.两侧是当前的歌曲播放进度和歌曲的总时长--两个lable