Iphone之选择图片滤镜功能的实现

来源:未知 责任编辑:责任编辑 发表时间:2014-01-25 11:34 点击:

Iphone之选择图片滤镜功能的实现

首先大家在做关于自拍软件的时候,会涉及到这样的功能,就是说给图片加滤镜,比如黑白,复古等效果,来使照片显示不同的效果。下面代码,就是如何实现了这一功能,当然,你可以加上你自己的效果,

个实现的效果如图:


 

photo2photo3


#import <UIKit/UIKit.h>
#import <QuartzCore/QuartzCore.h>
 
@interface PhotoSelectViewController : UIViewController
{
 
IBOutlet UIImageView *imageView;//图片
 
IBOutlet UIScrollView *scrollerView;//滚动视图显示所有滤镜图片
 
UIImage *theImage;//原始图片
 
int selectIndex;//选择的第几个图片
}
@end
/******各种颜色的设定*******/
//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
};
 
#import "PhotoSelectViewController.h"
 
@interface PhotoSelectViewController ()
 
@end
 
@implementation PhotoSelectViewController
 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
if (self) {
// Custom initialization
}
return self;
}
 
- (void)viewDidLoad
{
[super viewDidLoad];
 
theImage = [UIImage imageNamed:@"photo.png"];
imageView.image = theImage;
 
//添加滤镜
NSArray *arr = [NSArray arrayWithObjects:@"原图",@"LOMO",@"黑白",@"复古",@"哥特",@"锐色",@"淡雅",@"酒红",@"青柠",@"浪漫",@"光晕",@"蓝调",@"梦幻",@"夜色", nil];
//设置滚动视频的属性
scrollerView.backgroundColor = [UIColor colorWithRed:0 green:0 blue:0 alpha:0.5];
scrollerView.indicatorStyle = UIScrollViewIndicatorStyleBlack;
scrollerView.showsHorizontalScrollIndicator = NO;
scrollerView.showsVerticalScrollIndicator = NO;//关闭纵向滚动条
scrollerView.bounces = NO;
 
//把所有的显示效果图添加到scrollerView里面
float x ;//计算x坐标
for(int i=0;i<arr.count;i++)
{
x = 5 + 51*i;
//添加点击手势识别,来处理选择的图片
UITapGestureRecognizer *recognizer = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(setImageStyle:)];
recognizer.numberOfTouchesRequired = 1;
recognizer.numberOfTapsRequired = 1;
 
//添加名字标签
UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(x, 53, 40, 23)];
[label setBackgroundColor:[UIColor clearColor]];
[label setText:[arr objectAtIndex:i]];
[label setTextAlignment:NSTextAlignmentCenter];
[label setFont:[UIFont systemFontOfSize:13.0f]];
[label setTextColor:[UIColor whiteColor]];
[label setUserInteractionEnabled:YES];
[label setTag:i];
 
[scrollerView addSubview:label];
 
//添加效果图片
int tag = i+1000;
UIImageView *bgImageView = [[UIImageView alloc]initWithFrame:CGRectMake(x, 10, 43, 43)];
[bgImageView setTag:tag];
[bgImageView addGestureRecognizer:recognizer];
[bgImageView setUserInteractionEnabled:YES];
UIImage *bgImage = [self changeImage:bgImageView.tag imageView:nil];
bgImageView.image = bgImage;
[scrollerView addSubview:bgImageView];
[bgImageView setBackgroundColor:[UIColor redColor]];
 
//导入 <QuartzCore/QuartzCore.h>
//添加是否选中边框,选中时边框为黄色,默认是第一个被选中的
if (i == 0) {
 
CALayer * layer = [bgImageView layer];
layer.borderColor = [[UIColor yellowColor] CGColor];
layer.borderWidth = 1.0f;
 
selectIndex = tag;
}else{
CALayer * layer = [bgImageView layer];
layer.borderColor = [[UIColor blackColor] CGColor];
layer.borderWidth = 1.0f;
}
 
}
//设置滚动视图的实际大小
scrollerView.contentSize = CGSizeMake(x + 55, 60);
 
}
//选择图片处理方法
- (IBAction)setImageStyle:(UITapGestureRecognizer *)sender
{
//获取效果图
UIImage *image =   [self changeImage:sender.view.tag imageView:nil];
 
if (selectIndex != sender.view.tag) {
//取消选择边框
UIImageView *noselectImageView = (UIImageView*)[self.view viewWithTag:selectIndex];
CALayer * nolayer = [noselectImageView layer];
nolayer.borderColor = [[UIColor blackColor] CGColor];
nolayer.borderWidth = 1.0f;
 
selectIndex = sender.view.tag;
UIImageView *selectImageView = (UIImageView*)[self.view viewWithTag:selectIndex];
//添加选择边框
CALayer * layer = [selectImageView layer];
layer.borderColor = [[UIColor yellowColor] CGColor];
layer.borderWidth = 1.0f;
}
 
//图片设置
[imageView setImage:image];
}
 
//选择的效果图
-(UIImage *)changeImage:(int)index imageView:(UIImageView *)imageView
{
UIImage *image;
 
switch (index-1000) {
case 0:
{
return theImage;
}
break;
case 1:
{
image = [self imageWithImage:theImage withColorMatrix:colormatrix_lomo];
}
break;
case 2:
{
image = [self imageWithImage:theImage withColorMatrix:colormatrix_heibai];
}
break;
case 3:
{
image = [self imageWithImage:theImage withColorMatrix:colormatrix_huajiu];
}
break;
case 4:
{
image = [self imageWithImage:theImage withColorMatrix:colormatrix_gete];
}
break;
case 5:
{
image = [self imageWithImage:theImage withColorMatrix:colormatrix_ruise];
}
break;
case 6:
{
image = [self imageWithImage:theImage withColorMatrix:colormatrix_danya];
}
break;
case 7:
{
image = [self imageWithImage:theImage withColorMatrix:colormatrix_jiuhong];
}
break;
case 8:
{
image = [self imageWithImage:theImage withColorMatrix:colormatrix_qingning];
}
break;
case 9:
{
image = [self imageWithImage:theImage withColorMatrix:colormatrix_langman];
}
break;
case 10:
{
image = [self imageWithImage:theImage withColorMatrix:colormatrix_guangyun];
}
break;
case 11:
{
image = [self imageWithImage:theImage withColorMatrix:colormatrix_landiao];
 
}
break;
case 12:
{
image = [self imageWithImage:theImage withColorMatrix:colormatrix_menghuan];
 
}
break;
case 13:
{
image = [self imageWithImage:theImage withColorMatrix:colormatrix_yese];
 
}
}
return image;
}
 
//效果图
-(UIImage*)imageWithImage:(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);
 
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 *myImage = [UIImage imageWithCGImage:imageRef];
 
CFRelease(imageRef);
CGColorSpaceRelease(colorSpaceRef);
CGDataProviderRelease(provider);
return myImage;
}
 
static CGContextRef CreateRGBABitmapContext (CGImageRef inImage)// 返回一个使用RGBA通道的位图上下文
{
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); //分配足够容纳图片字节数的内存空间
 
context = CGBitmapContextCreate (bitmapData, pixelsWide, pixelsHigh, 8, bitmapBytesPerRow, colorSpace, kCGImageAlphaPremultipliedLast);
//创建CoreGraphic的图形上下文,该上下文描述了bitmaData指向的内存空间需要绘制的图像的一些绘制参数
 
CGColorSpaceRelease( colorSpace );
//Core Foundation中通过含有Create、Alloc的方法名字创建的指针,需要使用CFRelease()函数释放
 
return context;
}
 
static unsigned char *RequestImagePixelData(UIImage *inImage)
// 返回一个指针,该指针指向一个数组,数组中的每四个元素都是图像上的一个像素点的RGBA的数值(0-255),用无符号的char是因为它正好的取值范围就是0-255
{
CGImageRef img = [inImage CGImage];
CGSize size = [inImage size];
 
CGContextRef cgctx = CreateRGBABitmapContext(img); //使用上面的函数创建上下文
 
CGRect rect = {{0,0},{size.width, size.height}};
 
CGContextDrawImage(cgctx, rect, img); //将目标图像绘制到指定的上下文,实际为上下文内的bitmapData。
unsigned char *data = CGBitmapContextGetData (cgctx);
 
CGContextRelease(cgctx);//释放上面的函数创建的上下文
return data;
}
 
static void changeRGBA(int *red,int *green,int *blue,int *alpha, const float* f)//修改RGB的值
{
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;
}
}
 
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
 
- (void)viewDidUnload {
imageView = nil;
scrollerView = nil;
[super viewDidUnload];
}
@end
	
发表评论
请自觉遵守互联网相关的政策法规,严禁发布色情、暴力、反动的言论。
用户名: 验证码:点击我更换图片
最新评论 更多>>

推荐热点

  • Lexical or Preprocessor Issue 'xxx.h
  • ios学习笔记(二)xcode 4.3.2下实现基本交互
  • ios版本的helloworld
  • iphone(object-c) 内存管理(3) 有效的内存管理 前半部分
  • ios学习笔记(一)xcode 4.3.2下创建第一个ios项目
  • IOS类似iphone通讯录TableView的完整demo【附源码】
  • UITableView一些方法
  • [iPhone中级]iPhone团购信息客户端的开发 (二)
  • 如何为Iphone应用创建启动界面
网站首页 - 友情链接 - 网站地图 - TAG标签 - RSS订阅 - 内容搜索
Copyright © 2008-2015 计算机技术学习交流网. 版权所有

豫ICP备11007008号-1