通过这种方格图片实现滤镜

代码:

"CIFilter+ColorLUT.h"

"CIFilter+ColorLUT.m"

#import "CIFilter+ColorLUT.h"

#import <CoreImage/CoreImage.h>

#import <OpenGLES/EAGL.h>

@implementation CIFilter (ColorLUT)

+ (CIFilter *)colorCubeWithColorLUTImageNamed:(NSString *)imageName dimension:(NSInteger)n

{

UIImage *image = [UIImage imageNamed:imageName];

int width = CGImageGetWidth(image.CGImage);

int height = CGImageGetHeight(image.CGImage);

int rowNum = height / n;

int columnNum = width / n;

if ((width % n != 0) || (height % n != 0) || (rowNum * columnNum != n))

{

NSLog(@"Invalid colorLUT");

return nil;

}

unsigned char *bitmap = [self createRGBABitmapFromImage:image.CGImage];

if (bitmap == NULL)

{

return nil;

}

int size = n * n * n * sizeof(float) * 4;

float *data = malloc(size);

int bitmapOffest = 0;

int z = 0;

for (int row = 0; row <  rowNum; row++)

{

for (int y = 0; y < n; y++)

{

int tmp = z;

for (int col = 0; col < columnNum; col++)

{

for (int x = 0; x < n; x++) {

float r = (unsigned int)bitmap[bitmapOffest];

float g = (unsigned int)bitmap[bitmapOffest + 1];

float b = (unsigned int)bitmap[bitmapOffest + 2];

float a = (unsigned int)bitmap[bitmapOffest + 3];

int dataOffset = (z*n*n + y*n + x) * 4;

data[dataOffset] = r / 255.0;

data[dataOffset + 1] = g / 255.0;

data[dataOffset + 2] = b / 255.0;

data[dataOffset + 3] = a / 255.0;

bitmapOffest += 4;

}

z++;

}

z = tmp;

}

z += columnNum;

}

free(bitmap);

CIFilter *filter = [CIFilter filterWithName:@"CIColorCube"];

[filter setValue:[NSData dataWithBytesNoCopy:data length:size freeWhenDone:YES] forKey:@"inputCubeData"];

[filter setValue:[NSNumber numberWithInteger:n] forKey:@"inputCubeDimension"];

return filter;

}

+ (unsigned char *)createRGBABitmapFromImage:(CGImageRef)image

{

CGContextRef context = NULL;

CGColorSpaceRef colorSpace;

unsigned char *bitmap;

int bitmapSize;

int bytesPerRow;

size_t width = CGImageGetWidth(image);

size_t height = CGImageGetHeight(image);

bytesPerRow   = (width * 4);

bitmapSize     = (bytesPerRow * height);

bitmap = malloc( bitmapSize );

if (bitmap == NULL)

{

return NULL;

}

colorSpace = CGColorSpaceCreateDeviceRGB();

if (colorSpace == NULL)

{

free(bitmap);

return NULL;

}

context = CGBitmapContextCreate (bitmap,

width,

height,

8,

bytesPerRow,

colorSpace,

kCGImageAlphaPremultipliedLast);

CGColorSpaceRelease( colorSpace );

if (context == NULL)

{

free (bitmap);

}

CGContextDrawImage(context, CGRectMake(0, 0, width, height), image);

CGContextRelease(context);

return bitmap;

}

调用时生成使用图片

CIFilter *colorCube = [CIFilter colorCubeWithColorLUTImageNamed:@"方块图片"dimension:64];

CIImage *inputImage = [[CIImage alloc] initWithImage:[UIImage imageNamed:@"选择的照片"]];

[colorCube setValue:inputImage forKey:@"inputImage"];

CIImage *outputImage = [colorCube outputImage];

CIContext *context = [CIContext contextWithOptions:[NSDictionary dictionaryWithObject:(__bridge id)(CGColorSpaceCreateDeviceRGB()) forKey:kCIContextWorkingColorSpace]];

UIImage *newImage = [UIImage imageWithCGImage:[context createCGImage:outputImage fromRect:outputImage.extent]];

生成后的的滤镜图片newImage

ios ColorLUT滤镜的更多相关文章

  1. iOS开发 滤镜的使用

    iOS开发之滤镜的使用技巧(CoreImage)   一.滤镜的内容和效果是比较多并且复杂的 ,学习滤镜需要技巧 如下: 两个输出语句解决滤镜的属性选择问题: 1.查询效果分类中包含什么效果按住com ...

  2. iOS GPUImage 滤镜介绍

    这里直接引用官方描述: The GPUImage framework is a BSD-licensed iOS library that lets you apply GPU-accelerated ...

  3. iOS中滤镜处理及相关内存泄漏问题的解决

    最近工作之余在做一个美图秀秀的仿品 做到滤镜这块的时候  自己就参考了网上几位博主(名字忘了记,非常抱歉)的博客,但是发现跟着他们的demo做的滤镜处理,都会有很严重的内存泄漏,于是就自己按照大体的思 ...

  4. [iOS]CIFilter滤镜

    - (void)viewDidLoad { [super viewDidLoad]; // Do any additional setup after loading the view, typica ...

  5. iOS 简单滤镜

    转自:http://blog.csdn.net/lovechris00/article/details/51496458 1.主要是运用 ImageUtil库,把原图通过矩阵色值设置层不同滤镜效果下的 ...

  6. iOS中滤镜种类及相关介绍

  7. Android Animation学习 实现 IOS 滤镜退出动画

    IOS的用户体验做的很好,其中一点很重要的地方就是动画效果. 最近在学习Android的Animation,简单实现了一个IOS相机滤镜退出的动画: 布局文件:activity_animation_d ...

  8. 基于GPUImage的多滤镜rtmp直播推流

    之前做过开源videocore的推流改进:1)加入了美颜滤镜; 2) 加入了librtmp替换原来过于简单的rtmpclient: 后来听朋友说,在videocore上面进行opengl修改,加入新的 ...

  9. iOS滤镜实现之LOMO(美图秀秀经典LOMO)

    LOMO追求鲜艳色彩,随意.自由的态度,是一种经常使用的滤镜,今天介绍一下iOS 中LOMO滤镜的实现 首先它有3张输入图像 1.我们要处理的图像.即我们要应用LOMO滤镜的图像 2 3 在gpuim ...

随机推荐

  1. TortoiseSVN和VisualSVN-下载地址

    isualSVN的下载地址http://www.visualsvn.com/visualsvn/ 它可以以插件的形式嵌入到visual studio里面,让团队协作更轻松,最新的版本已经支持Visua ...

  2. django表单及母板

    在之前的埔文中说到了对Model的操作以及对url的路由映射等内容,对应django的mtv框架则是完成了学习,Model与viewer的操作,那么本节主要来唠叨一下template,当Model,v ...

  3. JwPlayer播放器【去除Logo、去除版本信息】

    效果图: <html> <head> <title>JwPlayer播放器@杯中红茶</title> <script type="tex ...

  4. ORACLE/MYSQL/DB2等不同数据库取前几条记录

    选取数据库中记录的操作是最基础最频繁的,但往往实际应用中不会这么简单,会在选取记录的时候加上一些条件,比如取前几条记录,下面就总结了如何在ORACLE/MYSQL/DB2等一些热门数据库中执行取前几条 ...

  5. IOS自适应库---- Masonry的使用

    Masonry是一个轻量级的布局框架,拥有自己的描述语法,采用更优雅的链式语法封装自动布局,简洁明了并具有高可读性,而且同时支持 iOS 和 Max OS X.Masonry是一个用代码写iOS或OS ...

  6. GridView+ZedGraph【转】

    edgraph图表控件的强大功能令人出乎意料,与OWC相比我想应该毫不逊色,近来需求要求作出相关数据统计,不想使用BI这类的强大东西,所以搜索到 了免费的开源的Zedgraph控件.使用起来也非常方便 ...

  7. XML 解析中,如何排除控制字符

    XML 解析中,如何排除控制字符 今天在解析一个中文的 XML时,始终报错 PCDATA invalid Char value 21 in Entity ,查询了一下这个 21 的ascii 值,发现 ...

  8. JavaScript获取css 行间样式,内连样式和外链样式的方式

    [行间样式获取] <div id='div1' style="backgroud:red">测试</div> <script> var odiv ...

  9. mysql升级后报Table 'mysql.servers' doesn't exist

    解决Table 'mysql.servers' doesn't exist 今天遇到一事,就是我在升级mysql数据库后进入数据建立一远程用户,结果报错了. mysql> flush privi ...

  10. zepto.1.1.6.js源码中的each方法学习笔记

    each方法接受要遍历的对象和对应的回调函数作为参数,它的作用是: 1.如果要遍历的对象是类似数组的形式(以该对象的length属性值的类型是否为number类型来判断),那么就把以要遍历的对象为执行 ...