关于GPUImage / 如何自定义分辨率相机 分辨率的问题求助

posts - 8,&
comments - 7,&
trackbacks - 0
导入方法转自:/S2-huai/p/3881349.html。。
(原文:/YouXianMing/p/3709715.html) (由于功力不足,经过自己实践,只能真机测试..望其他大神补充模拟器版)
1.GPUImage开源库并不像普通的开源库那样子,拖进你的工程中就可以用.首先上官网下载源码:&
2.找到framework文件夹,打开专为iOS使用的文件GPUImage.xcodeproj
3. 直接command + B编译,这里注意几个细节:选择真机测试,然后把Build Phases - Copy Headers中将所有的头文件从Project拖到Public,然后编译&(不知道为什么选模拟器编译不会生成.a文件,估只能选真机 &关于静态库,我是参考这里:&.cn/s/blog_7b9d64af0101jlym.html) ..
4.编译完,Products下面的libGPUImage.a变为灰色,可以右击 show in finder 看到两个文件 &一个.a,一个usr文件夹
5.把这两个文件拖进自己的工程,Build Settings - Linking - Other Linker Flags 双击写上 -ObjC (文档有写,本人是大概知道为什么要加而已,不懂深入)
6.添加需要的框架
7.可以全局import头文件一劳永逸,也可以自己手动,至此完成~
实现实时滤镜:
1.先定义滤镜和操作对象
2.再定义相机界面和相关滤镜。
3.当需要切换前后摄像头的时候,这里我没有找到相关的官方方法,所以就自己写了一个方法。
先定义一个属性
修改了这个属性的set方法。
这样就能实现滤镜。。。
GUPImage遇到的问题解决
在导入的时候遇到最大的问题就是一个了。。也是纠结了挺久。
找了很久,都说缺少或者Build Phases里边没有添加.m文件。。但是我们导入的是一个静态库啊。。怎么能找到.m文件?。。后来才发现应该是在生成静态库的时候没有选对真机调试。但是我确定自己是不是。。确实是真机。为什么不行?。我也不知道。哈。。。最后我通过选择这个来生成静态库之后就不报错了。。赞。
阅读(...) 评论()GPUImage 实现自定义相机 - 简书
GPUImage 实现自定义相机
这是基于第三方库GPUImage实现的自定义相机,主要是功能方面的实现,在UI上暂时并没有做很好的完善。主要包括功能有实时滤镜,准确聚焦,调整焦距,调整曝光,闪光灯设置,翻转前后相机以及拍照后的滤镜调整等
引入GPUImage库
主要有工程以依赖的形式加入GPUImage或者用Pod安装GPUImage的方法,网上类似教程很多,这里就不赘述了
制作自定义相机
新建一个CameraViewController,作为实时相机界面的Controller,并且做以下预处理及声明变量
#define HEIGHT 667.0
#define WIDTH 375.0
static int CameraFilterCount = 9;//滤镜的数量
///滤镜View的显示状态
typedef NS_ENUM(NSInteger, FilterViewState) {
FilterViewHidden,/**&隐藏*/
FilterViewUsing /**&显示*/
///闪光灯状态
typedef NS_ENUM(NSInteger, CameraManagerFlashMode) {
CameraManagerFlashModeAuto, /**&自动*/
CameraManagerFlashModeOff, /**&关闭*/
CameraManagerFlashModeOn /**&打开*/
@interface CameraViewController() &UIGestureRecognizerDelegate&
CALayer *_focusL //聚焦层
///新建相机cameraManager
@property (nonatomic,strong) GPUImageStillCamera *cameraM
*根据storyboard上将界面分为三个View,预览View,底部View以及整体的cameraView,也可以用代码实现
@property (strong, nonatomic) IBOutlet UIView *cameraV
@property (weak, nonatomic) IBOutlet UIView *
@property (weak, nonatomic) IBOutlet UIView *bottomV
@property CameraFilterView *cameraFilterV//自定义滤镜视图
@property (nonatomic , assign) CameraManagerFlashMode flashM
@property (nonatomic , assign) FilterViewState filterViewS
@property (nonatomic , weak) IBOutlet UIButton *flashB//闪光灯按钮
@property (nonatomic , assign) CGFloat beginGestureS//开始的缩放比例
@property (nonatomic , assign) CGFloat effectiveS//最后的缩放比例
@property GPUImageOutput *//滤镜
@property GPUImageView *filterV//实时滤镜预览视图
@property AVCaptureStillImageOutput *photoO//用于保存原图
@property CheckViewController *checkVC;//拍照之后跳转的ViewController
控制器视图方法
- (void)viewDidLoad{
//隐藏导航栏
[self.navigationController setNavigationBarHidden:YES];
//从SB初始化CheckController,后续解释FilterCode
_checkVC = [[self storyboard] instantiateViewControllerWithIdentifier:@"Check"];
[_checkVC setFilterCode:0];
//初始化相机,默认为前置相机
_cameraManager = [[MyCamera alloc] initWithSessionPreset:AVCaptureSessionPresetPhoto cameraPosition:AVCaptureDevicePositionFront];
_cameraManager.outputImageOrientation = UIInterfaceOrientationP//设置照片的方向为设备的定向
_cameraManager.horizontallyMirrorFrontFacingCamera = YES;//设置是否为镜像
_cameraManager.horizontallyMirrorRearFacingCamera = NO;
_filter = [[GPUImageFilter alloc] init];//初始化滤镜,默认初始化为原图GPUImageFilter
[self setfocusImage:[UIImage imageNamed:@"touch_focus_x"]];//初始化聚焦图片
*设置cameraManager的输出对象为filter,然后将preview强制转换为filterView添加到filter的输出对象中,这样在filterView中显示的就是相机捕捉到的并且经过filter滤镜处理的实时图像了
[self.cameraManager addTarget:_filter];
_filterView = (GPUImageView *)self.
[_filter addTarget:_filterView];
//初始化闪光灯模式为Auto
[self setFlashMode:CameraManagerFlashModeAuto];
//默认滤镜视图为隐藏,就是点击滤镜的按钮才会出现让你选择滤镜的那个小视图
[self setFilterViewState:FilterViewHidden];
//初始化开始及结束的缩放比例都为1.0
[self setBeginGestureScale:1.0f];
[self setEffectiveScale:1.0f];
//启动相机捕获
[self.cameraManager startCameraCapture];}
这里先给出CameraFilterView的实现方法,其实就是一个简单的一行的CollectionView,博主比较懒,引用了,在此表示感谢?
#import &UIKit/UIKit.h&
@protocol CameraFilterViewD
@interface CameraFilterView : UICollectionView &UICollectionViewDataSource, UICollectionViewDelegate, UICollectionViewDelegateFlowLayout&
@property (strong, nonatomic) NSMutableArray *picA//图片数组
@property (strong, nonatomic) id &CameraFilterViewDelegate& cameraFilterD
@protocol CameraFilterViewDelegate &NSObject&
- (void)switchCameraFilter:(NSInteger)//滤镜选择方法
#import "CameraFilterView.h"
static const float CELL_HEIGHT = 84.0f;
static const float CELL_WIDTH = 56.0f;
@implementation CameraFilterView
#pragma mark 初始化方法
- (id)initWithFrame:(CGRect)frame collectionViewLayout:(UICollectionViewLayout *)layout{
self = [super initWithFrame:frame collectionViewLayout:layout];
if (self) {
self.delegate =
self.dataSource =
#pragma mark collection 方法
-(NSInteger)numberOfSectionsInCollectionView:(UICollectionView *)collectionView
- (NSInteger)collectionView:(UICollectionView *)collectionView numberOfItemsInSection:(NSInteger)section{
return [_picArray count];
- (UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath{
static NSString *identifier = @"cameraFilterCellID";
[collectionView registerClass:[UICollectionViewCell class] forCellWithReuseIdentifier:identifier];
UICollectionViewCell *cell = [collectionView dequeueReusableCellWithReuseIdentifier:identifier forIndexPath:indexPath];
UIImageView *imageView = [[UIImageView alloc]initWithFrame:CGRectMake(0, 0, CELL_WIDTH, CELL_HEIGHT)];
imageView.image = [_picArray objectAtIndex:indexPath.row];
[cell addSubview:imageView];
cell.backgroundColor = [UIColor whiteColor];
- (CGSize)collectionView:(UICollectionView *)collectionView layout:(UICollectionViewLayout *)collectionViewLayout sizeForItemAtIndexPath:(NSIndexPath *)indexPath{
return CGSizeMake(CELL_WIDTH, CELL_HEIGHT);
- (void)collectionView:(UICollectionView *)collectionView didSelectItemAtIndexPath:(NSIndexPath *)indexPath{
[_cameraFilterDelegate switchCameraFilter:indexPath.row];
-(BOOL)collectionView:(UICollectionView *)collectionView shouldSelectItemAtIndexPath:(NSIndexPath *)indexPath
return YES;
关于Collection控件不懂的同学可以先复习一下CollectionView或者用其他的方法实现自定义控件
//添加滤镜视图到主视图上
- (void)addCameraFilterView {
UICollectionViewFlowLayout *layout = [[UICollectionViewFlowLayout alloc] init];
layout.scrollDirection = UICollectionViewScrollDirectionH
_cameraFilterView = [[CameraFilterView alloc] initWithFrame:CGRectMake(0, HEIGHT - _bottomView.frame.size.height - (WIDTH-4)/5 - 4, WIDTH, (WIDTH-4)/5) collectionViewLayout:layout];
NSMutableArray *filterNameArray = [[NSMutableArray alloc] initWithCapacity:CameraFilterCount];
for (NSInteger index = 0; index & CameraFilterC index++) {
UIImage *image = [UIImage imageNamed:@"girl"];
[filterNameArray addObject:image];
_cameraFilterView.cameraFilterDelegate =
_cameraFilterView.picArray = filterNameA
[self.view addSubview:_cameraFilterView];
//使用滤镜
- (IBAction)useFilter:(id)sender {
if (self.filterViewState == FilterViewHidden) {
[self addCameraFilterView];
[self setFilterViewState:FilterViewUsing];
[_cameraFilterView removeFromSuperview];
[self setFilterViewState:FilterViewHidden];
//设置聚焦图片
- (void)setfocusImage:(UIImage *)focusImage {
if (!focusImage)
if (!_focusLayer) {
//增加tap手势,用于聚焦及曝光
UITapGestureRecognizer *tap = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(focus:)];
[self.preview addGestureRecognizer:tap];
//增加pinch手势,用于调整焦距
UIPinchGestureRecognizer *pinch = [[UIPinchGestureRecognizer alloc] initWithTarget:self action:@selector(focusDisdance:)];
[self.preview addGestureRecognizer:pinch];
pinch.delegate =
UIImageView *imageView = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, focusImage.size.width, focusImage.size.height)];
imageView.image = focusI
CALayer *layer = imageView.
layer.hidden = YES;
[self.preview.layer addSublayer:layer];
_focusLayer =
//点击闪光灯按钮
- (IBAction)changeFlash:(id)sender {
[self changeFlashMode:_flashButton];
滤镜选择方法的实现
*以下的滤镜是GPUImage自带的滤镜,后面有几个效果不是很明显,我只是拿来做测试用。
*GPUImage自带的滤镜很多,大家可以都试试看,当然也可以自己写滤镜,这就需要后续深入学习了
*对checkViewController中filtercode属性的说明:filtercode是在选择滤镜的时候设置,
*在拍照的时候传值给CheckViewController,实际上拍照传递给CheckVC的是原图加上当前设置的filtercode,
*所以在后续CheckVC中改变滤镜的时候是基于原图进行改变。
- (void)switchCameraFilter:(NSInteger)index {
[self.cameraManager removeAllTargets];
switch (index) {
_filter = [[GPUImageFilter alloc] init];//原图
[_checkVC setFilterCode:0];
_filter = [[GPUImageHueFilter alloc] init];//绿巨人
[_checkVC setFilterCode:1];
_filter = [[GPUImageColorInvertFilter alloc] init];//负片
[_checkVC setFilterCode:2];
_filter = [[GPUImageSepiaFilter alloc] init];//老照片
[_checkVC setFilterCode:3];
_filter = [[GPUImageGaussianBlurPositionFilter alloc] init];
[(GPUImageGaussianBlurPositionFilter*)_filter setBlurRadius:40.0/320.0];
[_checkVC setFilterCode:4];
_filter = [[GPUImageSketchFilter alloc] init];//素描
[_checkVC setFilterCode:5];
_filter = [[GPUImageVignetteFilter alloc] init];//黑晕
[_checkVC setFilterCode:6];
_filter = [[GPUImageGrayscaleFilter alloc] init];//灰度
[_checkVC setFilterCode:7];
_filter = [[GPUImageToonFilter alloc] init];//卡通效果 黑色粗线描边
[_checkVC setFilterCode:8];
_filter = [[GPUImageFilter alloc] init];
[_checkVC setFilterCode:9];
[self.cameraManager addTarget:_filter];
[_filter addTarget:_filterView];
拍照方法的实现
- (IBAction)takePhoto:(id)sender {
_photoOutput = [_cameraManager getPhotoOutput];//得到源数据输出流
NSDictionary * outputSettings = [[NSDictionary alloc] initWithObjectsAndKeys:AVVideoCodecJPEG,AVVideoCodecKey, nil];
//这是输出流的设置参数AVVideoCodecJPEG参数表示以JPEG的图片格式输出图片
[_photoOutput setOutputSettings:outputSettings];
AVCaptureConnection *captureConnection=[_photoOutput connectionWithMediaType:AVMediaTypeVideo];
//根据连接取得设备输出的数据
[_photoOutput captureStillImageAsynchronouslyFromConnection:captureConnection completionHandler:^(CMSampleBufferRef imageDataSampleBuffer, NSError *error) {
if (imageDataSampleBuffer) {
NSData *imageData=[AVCaptureStillImageOutput jpegStillImageNSDataRepresentation:imageDataSampleBuffer];
UIImage *image=[UIImage imageWithData:imageData];
//将输出流数据转换成NSData,然后通过NSData将数据转换为UIImage传递给checkVC
_checkVC.image =
[self.navigationController pushViewController:_checkVC animated:YES];
转置摄像头
#pragma mark 转置摄像头
- (IBAction)turn:(id)sender {
[self.cameraManager stopCameraCapture];
if (_cameraManager.cameraPosition == AVCaptureDevicePositionFront) {
[_cameraManager initWithSessionPreset:AVCaptureSessionPresetPhoto cameraPosition:AVCaptureDevicePositionBack];
else if(_cameraManager.cameraPosition == AVCaptureDevicePositionBack)
[_cameraManager initWithSessionPreset:AVCaptureSessionPresetPhoto cameraPosition:AVCaptureDevicePositionFront];
_cameraManager.outputImageOrientation = UIInterfaceOrientationP
_cameraManager.horizontallyMirrorFrontFacingCamera = YES;
_cameraManager.horizontallyMirrorRearFacingCamera = NO;
[self.cameraManager addTarget:_filter];
_filterView = (GPUImageView *)self.
[_filter addTarget:_filterView];
[self setBeginGestureScale:1.0f];//在转换摄像头的时候把摄像头的焦距调回1.0
[self setEffectiveScale:1.0f];
[self.cameraManager startCameraCapture];
//调整焦距方法
-(void)focusDisdance:(UIPinchGestureRecognizer*)pinch {
self.effectiveScale = self.beginGestureScale * pinch.
if (self.effectiveScale & 1.0f) {
self.effectiveScale = 1.0f;
CGFloat maxScaleAndCropFactor = 3.0f;//设置最大放大倍数为3倍
if (self.effectiveScale & maxScaleAndCropFactor)
self.effectiveScale = maxScaleAndCropF
[CATransaction begin];
[CATransaction setAnimationDuration:.025];
if([self.cameraManager.inputCamera lockForConfiguration:&error]){
[self.cameraManager.inputCamera setVideoZoomFactor:self.effectiveScale];
[self.cameraManager.inputCamera unlockForConfiguration];
NSLog(@"ERROR = %@", error);
[CATransaction commit];
//手势代理方法
- (BOOL)gestureRecognizerShouldBegin:(UIGestureRecognizer *)gestureRecognizer
if ( [gestureRecognizer isKindOfClass:[UIPinchGestureRecognizer class]] ) {
self.beginGestureScale = self.effectiveS
return YES;
//对焦方法
- (void)focus:(UITapGestureRecognizer *)tap {
self.preview.userInteractionEnabled = NO;
CGPoint touchPoint = [tap locationInView:tap.view];
// CGContextRef *touchContext = UIGraphicsGetCurrentContext();
[self layerAnimationWithPoint:touchPoint];
*下面是照相机焦点坐标轴和屏幕坐标轴的映射问题,这个坑困惑了我好久,花了各种方案来解决这个问题,以下是最简单的解决方案也是最准确的坐标转换方式
if(_cameraManager.cameraPosition == AVCaptureDevicePositionBack){
touchPoint = CGPointMake( touchPoint.y /tap.view.bounds.size.height ,1-touchPoint.x/tap.view.bounds.size.width);
touchPoint = CGPointMake(touchPoint.y /tap.view.bounds.size.height ,touchPoint.x/tap.view.bounds.size.width);
/*以下是相机的聚焦和曝光设置,前置不支持聚焦但是可以曝光处理,后置相机两者都支持,下面的方法是通过点击一个点同时设置聚焦和曝光,当然根据需要也可以分开进行处理
if([self.cameraManager.inputCamera isExposurePointOfInterestSupported] && [self.cameraManager.inputCamera isExposureModeSupported:AVCaptureExposureModeContinuousAutoExposure])
if ([self.cameraManager.inputCamera lockForConfiguration:&error]) {
[self.cameraManager.inputCamera setExposurePointOfInterest:touchPoint];
[self.cameraManager.inputCamera setExposureMode:AVCaptureExposureModeContinuousAutoExposure];
if ([self.cameraManager.inputCamera isFocusPointOfInterestSupported] && [self.cameraManager.inputCamera isFocusModeSupported:AVCaptureFocusModeAutoFocus]) {
[self.cameraManager.inputCamera setFocusPointOfInterest:touchPoint];
[self.cameraManager.inputCamera setFocusMode:AVCaptureFocusModeAutoFocus];
[self.cameraManager.inputCamera unlockForConfiguration];
NSLog(@"ERROR = %@", error);
//对焦动画
- (void)layerAnimationWithPoint:(CGPoint)point {
if (_focusLayer) {
///聚焦点聚焦动画设置
CALayer *focusLayer = _focusL
focusLayer.hidden = NO;
[CATransaction begin];
[CATransaction setDisableActions:YES];
[focusLayer setPosition:point];
focusLayer.transform = CATransform3DMakeScale(2.0f,2.0f,1.0f);
[CATransaction commit];
CABasicAnimation *animation = [ CABasicAnimation animationWithKeyPath: @"transform" ];
animation.toValue = [ NSValue valueWithCATransform3D: CATransform3DMakeScale(1.0f,1.0f,1.0f)];
animation.delegate =
animation.duration = 0.3f;
animation.repeatCount = 1;
animation.removedOnCompletion = NO;
animation.fillMode = kCAFillModeF
[focusLayer addAnimation: animation forKey:@"animation"];
//动画的delegate方法
- (void)animationDidStop:(CAAnimation *)anim finished:(BOOL)flag {
[self performSelector:@selector(focusLayerNormal) withObject:self afterDelay:0.5f];
//focusLayer回到初始化状态
- (void)focusLayerNormal {
self.preview.userInteractionEnabled = YES;
_focusLayer.hidden = YES;
闪光灯设置
//设置闪光灯模式
- (void)setFlashMode:(CameraManagerFlashMode)flashMode {
_flashMode = flashM
switch (flashMode) {
case CameraManagerFlashModeAuto: {
[self.cameraManager.inputCamera lockForConfiguration:nil];
if ([self.cameraManager.inputCamera isFlashModeSupported:AVCaptureFlashModeAuto]) {
[self.cameraManager.inputCamera setFlashMode:AVCaptureFlashModeAuto];
[self.cameraManager.inputCamera unlockForConfiguration];
case CameraManagerFlashModeOff: {
[self.cameraManager.inputCamera lockForConfiguration:nil];
[self.cameraManager.inputCamera setFlashMode:AVCaptureFlashModeOff];
[self.cameraManager.inputCamera unlockForConfiguration];
case CameraManagerFlashModeOn: {
[self.cameraManager.inputCamera lockForConfiguration:nil];
[self.cameraManager.inputCamera setFlashMode:AVCaptureFlashModeOn];
[self.cameraManager.inputCamera unlockForConfiguration];
#pragma mark 改变闪光灯状态
- (void)changeFlashMode:(UIButton *)button {
switch (self.flashMode) {
case CameraManagerFlashModeAuto:
self.flashMode = CameraManagerFlashModeOn;
[button setImage:[UIImage imageNamed:@"flashing_on"] forState:UIControlStateNormal];
case CameraManagerFlashModeOff:
self.flashMode = CameraManagerFlashModeA
[button setImage:[UIImage imageNamed:@"flashing_auto"] forState:UIControlStateNormal];
case CameraManagerFlashModeOn:
self.flashMode = CameraManagerFlashModeO
[button setImage:[UIImage imageNamed:@"flashing_off"] forState:UIControlStateNormal];
对拍照之后的照片进行滤镜处理
这个其实很简单,处理方案和之前的实时滤镜差不多,也是通过FilterController来实现滤镜的选择,下面就给出选择滤镜之后进行处理的函数
- (void)switchCameraFilter:(NSInteger)index {
UIImage *inputImage = self.
switch (index) {
_filter = [[GPUImageFilter alloc] init];//原图
_filter = [[GPUImageHueFilter alloc] init];//绿巨人
_filter = [[GPUImageColorInvertFilter alloc] init];//负片
_filter = [[GPUImageSepiaFilter alloc] init];//老照片
_filter = [[GPUImageGaussianBlurPositionFilter alloc] init];
[(GPUImageGaussianBlurPositionFilter*)_filter setBlurRadius:40.0/320.0];
_filter = [[GPUImageMedianFilter alloc] init];
_filter = [[GPUImageVignetteFilter alloc] init];//黑晕
_filter = [[GPUImageKuwaharaRadius3Filter alloc] init];
_filter = [[GPUImageBilateralFilter alloc] init];
_filter = [[GPUImageFilter alloc] init];
//到这里为止和实时滤镜的处理都一样,不一样的就只有下面几句
[_filter forceProcessingAtSize:inputImage.size];
[_filter useNextFrameForImageCapture];
GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage smoothlyScaleOutput:YES];
[stillImageSource addTarget:_filter];
[stillImageSource processImage];
_currentImage = [_filter imageFromCurrentFramebuffer];
//这里得到的currentImage就是添加了滤镜之后的照片,可以放在imageView中直接显示,也可以稍加处理保存到相册
[self.imageView setImage:_currentImage];
以上是最近在做自定义相机时做的一点总结,之前在做的时候也查阅了很多文章,感觉相对比较分散,所以这里就稍微做一下整理,希望大家在做类似需求的开发时能少碰到点坑。当然我做的也不怎么完善,风格也比较杂乱,后续会对此做些改进。
有什么不对的地方欢迎大家批评指正,共同学习
keep on and on..iOS之GPUImage图片处理框架的使用 - CSDN博客
iOS之GPUImage图片处理框架的使用
& & & & &GPUImage是一个基于GPU图像和视频处理的开源iOS框架,提供各种各样的图像处理滤镜,并且支持照相机和摄像机的实时滤镜; 基于GPU的图像加速,因此可以加速对实时摄像头视频、电影以及image的滤镜和其它效果处理,并且能够自定义图像滤镜。 GPUImage支持ARC。
& & & &使用GPUImage处理图片比Core Image更简单,只需要将过滤器赋给图片对象即可,不用考虑context或者设备等其他问题。GPUImage提供了除高斯模糊外的其他几种不同效果的模糊,虽然Core Image也提供了几种模糊效果,但目前在iOS上能用的就只有高斯模糊,而GPUImage可用的有FastBlur, GaussianBlur, GaussianSelectiveBlur 和 BoxBlur。GPUImage还支持自定义的过滤器。
滤镜基本原理
滤镜处理的原理就是把静态图片或者视频的每一帧进行图形变换再显示出来。它的本质就是像素点的坐标和颜色变化。
图像处理流程
数据源需要实现GPUImageOutput接口,而后续各个环节(包括最后处理输出结果)的对象都要实现GPUImageInput接口。每个处理环节都是从上一个环节获取图像数据,进行处理后再将结果传递给下一个。下游的处理对象称为上一步的target。使用addTarget:方法为处理链路添加每个环节的对象。一个常见的链条如下:
数据源(例如GPUImageVideoCamera或者GPUImageMovie,或GPUImageStillCamera,或GPUImagePicture
)-&各类filter-&GPUImageView
如果需要将结果输出到文件,只要把上述流程中最末的GPUImageView改为一个GPUImageMovieWriter即可。
使用步骤:方法一:编译成静态库,然后导入.a静态库和usr文件夹;
解压文件,在解压好的文件夹中有个bulid.sh文件,打开终端,
cd GPUImage的文件夹位置
然后将bulid.sh文件拖入到终端中,运行;
运行之后,文件夹中会多出一个名为bulid的文件夹,在此文件夹中找到 release-iPhone文件夹。在该文件夹下有两个文件,将这两个文件夹拷贝到所要添加的工程中;
4.导入所需库
添加下面这些系统framework:
AVFoundation
QuartzCore
===============
使用过程中遇到的一些问题:
-[UIView nextAvailableTextureIndex]: unrecognized selector sent to instance 0x16658d00
在storyboard里面把viewControl的view的类改为GPUImageView!!不然会报错,这也是烦扰了我半天的问题!google到了stackOverFlow才找到的答案。。
如果还报错,看看target-build setting里面,other linker flags 里面是否添加了 &&-fobjc-arc &&-ObjC 这两项
5.如果程序运行时在[[[GPUImageContext sharedImageProcessingContext]
context] renderbufferStorage:GL_RENDERBUFFER fromDrawable:(CAEAGLLayer*)self.layer]; 出现EXC_BAD_ACCESS。&
需要修改Product-&Scheme-&Edit Scheme-&Options-&GPU Frame Capture 选择 Disabled。
===========
GUPImage里有一张标准图如下
设计师用 Photoshop 调出来的色彩效果输出在了这种「格子图」上,在 App 里通过解析「格子图」得到了色彩的变化规则,然后把这个规则应用在了图片/视频上,这种规则就是一种滤镜的算法。注意,这里只能进行颜色上的调整(曲线,色彩平衡等),其他效果调整也只限于利用图层间混合模式的更改,例如可做暗角、漏光等效果。
GPUImage中自带三种这样的滤镜GPUImageAmatorkaFilter,这个滤镜就是lookup_amatorka.png 参照基本图在PS上做出来的、GPUImageMissEtikateFilter、GPUImageSoftEleganceFilter,根据这样的方法,把标准图给设计师,设计师添加完产品需要的调色动作,把新图导入程序,调用上面GPUImage中的方法,就得到了想要的滤镜。
Color adjustments:&&31 filters
& & GPUImageBrightnessFilter
& & GPUImageExposureFilter
& & GPUImageContrastFilter
& & GPUImageSaturationFilter
& & GPUImageGammaFilter
& & GPUImageLevelsFilter
& & GPUImageColorMatrixFilter
& & GPUImageRGBFilter
& & GPUImageHueFilter
& & GPUImageToneCurveFilter
& & GPUImageHighlightShadowFilter
& & GPUImageLookupFilter
& & GPUImageAmatorkaFilter
& & GPUImageMissEtikateFilter
& & GPUImageSoftEleganceFilter
& & GPUImageColorInvertFilter
& & GPUImageGrayscaleFilter
& & GPUImageMonochromeFilter
& & GPUImageFalseColorFilter
& & GPUImageHazeFilter
& & GPUImageSepiaFilter
& & GPUImageOpacityFilter
& & GPUImageSolidColorGenerator
& & GPUImageLuminanceThresholdFilter
& & GPUImageAdaptiveThresholdFilter
& & GPUImageAverageLuminanceThresholdFilter
& & GPUImageHistogramFilter
& & GPUImageHistogramGenerator
& & GPUImageAverageColor
& & GPUImageLuminosity
& & GPUImageChromaKeyFilter&
Image processing:&&40 filters
& & GPUImageTransformFilter
& & GPUImageCropFilter
& & GPUImageLanczosResamplingFilter
& & GPUImageSharpenFilter
& & GPUImageUnsharpMaskFilter
& & GPUImageGaussianBlurFilter
& & GPUImageBoxBlurFilter
& & GPUImageSingleComponentGaussianBlurFilter
& & GPUImageGaussianSelectiveBlurFilter
& & GPUImageGaussianBlurPositionFilter
& & GPUImageiOSBlurFilter
& & GPUImageMedianFilter
& & GPUImageBilateralFilter
& & GPUImageTiltShiftFilter
& & GPUImage3x3ConvolutionFilter
& & GPUImageSobelEdgeDetectionFilter
& & GPUImagePrewittEdgeDetectionFilter
& & GPUImageThresholdEdgeDetectionFilter
& & GPUImageCannyEdgeDetectionFilter
& & GPUImageHarrisCornerDetectionFilter
& & GPUImageNobleCornerDetectionFilter
& & GPUImageShiTomasiCornerDetectionFilter
& & GPUImageNonMaximumSuppressionFilter
& & GPUImageXYDerivativeFilter
& & GPUImageCrosshairGenerator
& & GPUImageDilationFilter
& & GPUImageRGBDilationFilter
& & GPUImageErosionFilter
& & GPUImageRGBErosionFilter
& & GPUImageOpeningFilter
& & GPUImageRGBOpeningFilter
& & GPUImageClosingFilter
& & GPUImageRGBClosingFilter
& & GPUImageLocalBinaryPatternFilter
& & GPUImageLowPassFilter
& & GPUImageHighPassFilter
& & GPUImageMotionDetector
& & GPUImageHoughTransformLineDetector
& & GPUImageLineGenerator
& & GPUImageMotionBlurFilter
Blending modes: 29 filters
& & GPUImageZoomBlurFilter
& & GPUImageChromaKeyBlendFilter
& & GPUImageDissolveBlendFilter
& & GPUImageMultiplyBlendFilter
& & GPUImageAddBlendFilter
& & GPUImageSubtractBlendFilter
& & GPUImageDivideBlendFilter
& & GPUImageOverlayBlendFilter
& & GPUImageDarkenBlendFilter
& & GPUImageLightenBlendFilter
& & GPUImageColorBurnBlendFilter
& & GPUImageColorDodgeBlendFilter
& & GPUImageScreenBlendFilter
& & GPUImageExclusionBlendFilter
& & GPUImageDifferenceBlendFilter
& & GPUImageHardLightBlendFilter
& & GPUImageSoftLightBlendFilter
& & GPUImageAlphaBlendFilter
& & GPUImageSourceOverBlendFilter
& & GPUImageColorBurnBlendFilter
& & GPUImageColorDodgeBlendFilter
& & GPUImageNormalBlendFilter
& & GPUImageColorBlendFilter
& & GPUImageHueBlendFilter
& & GPUImageSaturationBlendFilter
& & GPUImageLuminosityBlendFilter
& & GPUImageLinearBurnBlendFilter
& & GPUImagePoissonBlendFilter
& & GPUImageMaskFilter
Visual effects: 25 filters
& & GPUImagePixellateFilter
& & GPUImagePolarPixellateFilter
& & GPUImagePolkaDotFilter
& & GPUImageHalftoneFilter
& & GPUImageCrosshatchFilter
& & GPUImageSketchFilter
& & GPUImageThresholdSketchFilter
& & GPUImageToonFilter
& & GPUImageSmoothToonFilter
& & GPUImageEmbossFilter
& & GPUImagePosterizeFilter
& & GPUImageSwirlFilter
& & GPUImageBulgeDistortionFilter
& & GPUImagePinchDistortionFilter
& & GPUImageStretchDistortionFilter
& & GPUImageSphereRefractionFilter
& & GPUImageGlassSphereFilter
& & GPUImageVignetteFilter
& & GPUImageKuwaharaFilter
& & GPUImageKuwaharaRadius3Filter
& & GPUImagePerlinNoiseFilter
& & GPUImageCGAColorspaceFilter
& & GPUImageMosaicFilter
& & GPUImageJFAVoronoiFilter
& & GPUImageVoronoiConsumerFilter
滤镜展示列表:
#import &GPUImageBrightnessFilter.h&
//亮度 #import &GPUImageExposureFilter.h&
#import &GPUImageContrastFilter.h&
//对比度 #import &GPUImageSaturationFilter.h&
//饱和度 #import &GPUImageGammaFilter.h&
#import &GPUImageColorInvertFilter.h&
#import &GPUImageSepiaFilter.h&
//褐色(怀旧) #import &GPUImageLevelsFilter.h&
#import &GPUImageGrayscaleFilter.h&
#import &GPUImageHistogramFilter.h&
//色彩直方图,显示在图片上
#import &GPUImageHistogramGenerator.h&
//色彩直方图 #import &GPUImageRGBFilter.h&
//RGB #import &GPUImageToneCurveFilter.h&
//色调曲线 #import &GPUImageMonochromeFilter.h&
#import &GPUImageOpacityFilter.h&
//不透明度 #import &GPUImageHighlightShadowFilter.h&
//提亮阴影
#import &GPUImageFalseColorFilter.h&
//色彩替换(替换亮部和暗部色彩) #import &GPUImageHueFilter.h&
//色度 #import &GPUImageChromaKeyFilter.h&
#import &GPUImageWhiteBalanceFilter.h&
//白平横 #import &GPUImageAverageColor.h&
//像素平均色值
#import &GPUImageSolidColorGenerator.h&
#import &GPUImageLuminosity.h&
//亮度平均
#import &GPUImageAverageLuminanceThresholdFilter.h& //像素色值亮度平均,图像黑白(有类似漫画效果)
#import &GPUImageLookupFilter.h&
//lookup 色彩调整
#import &GPUImageAmatorkaFilter.h&
//Amatorka lookup #import &GPUImageMissEtikateFilter.h&
//MissEtikate lookup #import &GPUImageSoftEleganceFilter.h&
//SoftElegance lookup
图像处理 Handle Image
#import &GPUImageCrosshairGenerator.h&
//十字 #import &GPUImageLineGenerator.h&
//线条 #import &GPUImageTransformFilter.h&
//形状变化
#import &GPUImageCropFilter.h&
//剪裁 #import &GPUImageSharpenFilter.h&
//锐化 #import &GPUImageUnsharpMaskFilter.h&
//反遮罩锐化 #import &GPUImageFastBlurFilter.h&
#import &GPUImageGaussianBlurFilter.h&
//高斯模糊
#import &GPUImageGaussianSelectiveBlurFilter.h&
//高斯模糊,选择部分清晰 #import &GPUImageBoxBlurFilter.h&
//盒状模糊
#import &GPUImageTiltShiftFilter.h&
//条纹模糊,中间清晰,上下两端模糊
#import &GPUImageMedianFilter.h&
//中间值,有种稍微模糊边缘的效果
#import &GPUImageBilateralFilter.h&
//双边模糊
#import &GPUImageErosionFilter.h&
//侵蚀边缘模糊,变黑白
#import &GPUImageRGBErosionFilter.h&
//RGB侵蚀边缘模糊,有色彩
#import &GPUImageDilationFilter.h&
//扩展边缘模糊,变黑白
#import &GPUImageRGBDilationFilter.h&
//RGB扩展边缘模糊,有色彩
#import &GPUImageOpeningFilter.h&
//黑白色调模糊
#import &GPUImageRGBOpeningFilter.h&
//彩色模糊
#import &GPUImageClosingFilter.h&
//黑白色调模糊,暗色会被提亮
#import &GPUImageRGBClosingFilter.h&
//彩色模糊,暗色会被提亮
#import &GPUImageLanczosResamplingFilter.h&
//Lanczos重取样,模糊效果
#import &GPUImageNonMaximumSuppressionFilter.h&
//非最大抑制,只显示亮度最高的像素,其他为黑
#import &GPUImageThresholdedNonMaximumSuppressionFilter.h& //与上相比,像素丢失更多
#import &GPUImageSobelEdgeDetectionFilter.h&
//Sobel边缘检测算法(白边,黑内容,有点漫画的反色效果)
#import &GPUImageCannyEdgeDetectionFilter.h&
//Canny边缘检测算法(比上更强烈的黑白对比度)
#import &GPUImageThresholdEdgeDetectionFilter.h&
//阈值边缘检测(效果与上差别不大)
#import &GPUImagePrewittEdgeDetectionFilter.h&
//普瑞维特(Prewitt)边缘检测(效果与Sobel差不多,貌似更平滑)
#import &GPUImageXYDerivativeFilter.h&
//XYDerivative边缘检测,画面以蓝色为主,绿色为边缘,带彩色
#import &GPUImageHarrisCornerDetectionFilter.h&
//Harris角点检测,会有绿色小十字显示在图片角点处
#import &GPUImageNobleCornerDetectionFilter.h&
//Noble角点检测,检测点更多 #import &GPUImageShiTomasiFeatureDetectionFilter.h& //ShiTomasi角点检测,与上差别不大
#import &GPUImageMotionDetector.h&
//动作检测 #import &GPUImageHoughTransformLineDetector.h&
//线条检测 #import &GPUImageParallelCoordinateLineTransformFilter.h& //平行线检测 #import &GPUImageLocalBinaryPatternFilter.h&
//图像黑白化,并有大量噪点 #import &GPUImageLowPassFilter.h&
//用于图像加亮 #import &GPUImageHighPassFilter.h&
//图像低于某值时显示为黑 #pragma mark - 视觉效果 Visual Effect#import &GPUImageSketchFilter.h&
//素描 #import &GPUImageThresholdSketchFilter.h&
//阀值素描,形成有噪点的素描 #import &GPUImageToonFilter.h&
//卡通效果(黑色粗线描边) #import &GPUImageSmoothToonFilter.h&
//相比上面的效果更细腻,上面是粗旷的画风 #import &GPUImageKuwaharaFilter.h&
//桑原(Kuwahara)滤波,水粉画的模糊效果;处理时间比较长,慎用 #import &GPUImageMosaicFilter.h&
//黑白马赛克 #import &GPUImagePixellateFilter.h&
//像素化 #import &GPUImagePolarPixellateFilter.h&
//同心圆像素化 #import &GPUImageCrosshatchFilter.h&
//交叉线阴影,形成黑白网状画面#import &GPUImageColorPackingFilter.h&
//色彩丢失,模糊(类似监控摄像效果)
#import &GPUImageVignetteFilter.h&
//晕影,形成黑色圆形边缘,突出中间图像的效果 #import &GPUImageSwirlFilter.h&
//漩涡,中间形成卷曲的画面 #import &GPUImageBulgeDistortionFilter.h&
//凸起失真,鱼眼效果 #import &GPUImagePinchDistortionFilter.h&
//收缩失真,凹面镜 #import &GPUImageStretchDistortionFilter.h&
//伸展失真,哈哈镜 #import &GPUImageGlassSphereFilter.h&
//水晶球效果 #import &GPUImageSphereRefractionFilter.h&
//球形折射,图形倒立
#import &GPUImagePosterizeFilter.h&
//色调分离,形成噪点效果#import &GPUImageCGAColorspaceFilter.h&
//CGA色彩滤镜,形成黑、浅蓝、紫色块的画面 #import &GPUImagePerlinNoiseFilter.h&
//柏林噪点,花边噪点 #import &GPUImage3x3ConvolutionFilter.h&
//3x3卷积,高亮大色块变黑,加亮边缘、线条等 #import &GPUImageEmbossFilter.h&
//浮雕效果,带有点3d的感觉 #import &GPUImagePolkaDotFilter.h&
//像素圆点花样#import &GPUImageHalftoneFilter.h&
//点染,图像黑白化,由黑点构成原图的大致图形#pragma mark - 混合模式 Blend#import &GPUImageMultiplyBlendFilter.h&
//通常用于创建阴影和深度效果 #import &GPUImageNormalBlendFilter.h&
//正常 #import &GPUImageAlphaBlendFilter.h&
//透明混合,通常用于在背景上应用前景的透明度 #import &GPUImageDissolveBlendFilter.h&
//溶解 #import &GPUImageOverlayBlendFilter.h&
//叠加,通常用于创建阴影效果 #import &GPUImageDarkenBlendFilter.h&
//加深混合,通常用于重叠类型 #import &GPUImageLightenBlendFilter.h&
//减淡混合,通常用于重叠类型 #import &GPUImageSourceOverBlendFilter.h&
//源混合 #import &GPUImageColorBurnBlendFilter.h&
//色彩加深混合 #import &GPUImageColorDodgeBlendFilter.h&
//色彩减淡混合 #import &GPUImageScreenBlendFilter.h&
//屏幕包裹,通常用于创建亮点和镜头眩光 #import &GPUImageExclusionBlendFilter.h&
//排除混合 #import &GPUImageDifferenceBlendFilter.h&
//差异混合,通常用于创建更多变动的颜色 #import &GPUImageSubtractBlendFilter.h&
//差值混合,通常用于创建两个图像之间的动画变暗模糊效果 #import &GPUImageHardLightBlendFilter.h&
//强光混合,通常用于创建阴影效果 #import &GPUImageSoftLightBlendFilter.h&
//柔光混合 #import &GPUImageChromaKeyBlendFilter.h&
//色度键混合 #import &GPUImageMaskFilter.h&
//遮罩混合 #import &GPUImageHazeFilter.h&
//朦胧加暗 #import &GPUImageLuminanceThresholdFilter.h&
//亮度阈 #import &GPUImageAdaptiveThresholdFilter.h&
//自适应阈值 #import &GPUImageAddBlendFilter.h&
//通常用于创建两个图像之间的动画变亮模糊效果 #import &GPUImageDivideBlendFilter.h&
//通常用于创建两个图像之间的动画变暗模糊效果#import &GPUImageJFAVoroniFilter.h& #import &GPUImageVoroniConsumerFilter.h&
GPUIMage的常用功能:------
#import &ViewController.h&
@interface
ViewController ()&GPUImageMovieDelegate,GPUImageMovieWriterDelegate&
@property(nonatomic,strong)& &GPUImageVideoCamera
@property(nonatomic,strong)&GPUImageStillCamera
*& stillC//拍照
@property(nonatomic,strong)GPUImageMovie
@property(nonatomic,strong)GPUImageFilterGroup*
_filterG//滤镜组
@implementation ViewController
- (void)viewDidLoad
& & [superviewDidLoad];
//& & [self livevideo];//摄像滤镜
//& & & [self takePhoto];//拍照滤镜
//& & [self imageFilter];//手动照片滤镜
//& & [self SingleimageFilter];//单个自动照片滤镜
//& & [self videoAndStore];//播放录象滤镜并存储
//& & [self addManyFilter];//添加滤镜组
//[self AutoDefineSingleimageFilter];//自定义的滤镜
& & [selfGPUImageAmatorkaFilterTest];//三种特殊的滤镜,需要导入左边sources中的图片
//录像滤镜
-(void)livevideo{
//第一个参数:相机捕获视屏或图片的质量.有一次啊选项
/*AVCaptureSessionPresetPhoto
& & AVCaptureSessionPresetHigh
& & AVCaptureSessionPresetMedium
& & AVCaptureSessionPresetLow
& & AVCaptureSessionPreset320x240
& & AVCaptureSessionPreset352x288
& & AVCaptureSessionPreset640x480
& & AVCaptureSessionPreset960x540
& & AVCaptureSessionPreset
& & AVCaptureSessionPreset
& & AVCaptureSessionPreset
& & AVCaptureSessionPresetiFrame960x540
& & AVCaptureSessionPresetiFrame
//第二个参数相机的位置
/*typedef NS_ENUM(NSInteger, AVCaptureDevicePosition) {
&& & AVCaptureDevicePositionUnspecified & & & & = 0,
&& & AVCaptureDevicePositionBack& & & & & & & & = 1,
&& & AVCaptureDevicePositionFront & & & & & & & = 2
&& & } NS_AVAILABLE(10_7, 4_0) __TVOS_PROHIBITED;
& & GPUImageVideoCamera *videocamera=[[GPUImageVideoCameraalloc]initWithSessionPreset:AVCaptureSessionPreset640x480cameraPosition:AVCaptureDevicePositionBack];
& & self.videocamera=//这个相机一定要用一个强引用,防止销毁
//设置下面这个后,倒转手机后,画面也会跟着倒过来
& & videocamera.horizontallyMirrorFrontFacingCamera =NO;
& & videocamera.horizontallyMirrorRearFacingCamera =NO;
/*捕获画面的方向设置,
&& & typedef NS_ENUM(NSInteger, UIInterfaceOrientation) {
&& & UIInterfaceOrientationUnknown& & & & & & = UIDeviceOrientationUnknown,
&& & UIInterfaceOrientationPortrait & & & & & = UIDeviceOrientationPortrait,
&& & UIInterfaceOrientationPortraitUpsideDown = UIDeviceOrientationPortraitUpsideDown,
&& & UIInterfaceOrientationLandscapeLeft& & & = UIDeviceOrientationLandscapeRight,
&& & UIInterfaceOrientationLandscapeRight & & = UIDeviceOrientationLandscapeLeft
&& & } __TVOS_PROHIBITED;
& & videocamera.outputImageOrientation =UIInterfaceOrientationPortrait;
& & //创建滤镜
& GPUImageSepiaFilter *filter = [[GPUImageSepiaFilteralloc]
//相机添加滤镜对象
& & [videocamera addTarget:filter];
& & //创建滤镜显示的view
& & & & GPUImageView *filterView=[[GPUImageViewalloc]initWithFrame:CGRectMake(10,10,
300,300)];
& & & & & [self.viewaddSubview:filterView];//添加滤镜view到view上
& & //如果要用控制器本身的view作滤镜显示view要把控制器的view强转成GPUIMageView,如果用的是storyBoard,storyboard中的相应地view类型名要改成GPUIMageview
//& & GPUImageView *filterView = (GPUImageView *)self.
& & //滤镜对象添加要显示的
& & [filter addTarget:filterView];
//相机开始捕获图像画面
& & [videocamera startCameraCapture];
//拍照滤镜------相机拍照和录像都要创建显示滤镜的view,处理已有的图片和视频时不需要创建view
-(void)takePhoto{
& GPUImageStillCamera *& stillCamera = [[GPUImageStillCameraalloc]
& & self.stillCamera=stillC
& & stillCamera.outputImageOrientation =UIInterfaceOrientationPortrait;
& GPUImageGammaFilter*& filter = [[GPUImageGammaFilteralloc]
& & [stillCamera addTarget:filter];
& & GPUImageView *filterView = (GPUImageView *)self.view;
& & [filter addTarget:filterView];
& & [stillCamera startCameraCapture];
//这是手动操作滤镜,可以添加多个滤镜
-(void)imageFilter{
& & UIImage *inputImage = [UIImageimageNamed:@&shensu.jpg&];
& & GPUImagePicture *stillImageSource = [[GPUImagePicturealloc]
initWithImage:inputImage];
& & GPUImageSepiaFilter *stillImageFilter = [[GPUImageSepiaFilteralloc]
& & [stillImageSource addTarget:stillImageFilter];
& & [stillImageFilter useNextFrameForImageCapture];//告诉滤镜以后用它,节省内存
& & [stillImageSource processImage];//滤镜渲染
& & UIImage *currentFilteredVideoFrame = [stillImageFilterimageFromCurrentFramebuffer];//从当前滤镜缓冲区获取滤镜图片
& & UIImageView *imagev=[[UIImageViewalloc]initWithImage:currentFilteredVideoFrame];
& & imagev.frame=self.view.frame;
& & [self.viewaddSubview:imagev];
//给图片添加单个滤镜,自动添加滤镜
-(void)SingleimageFilter{
& & UIImage *inputImage = [UIImageimageNamed:@&shensu.jpg&];
& & GPUImageSepiaFilter *stillImageFilter2 = [[GPUImageSepiaFilteralloc]
& & UIImage *currentFilteredVideoFrame = [stillImageFilter2imageByFilteringImage:inputImage];
& & UIImageView *imagev=[[UIImageViewalloc]initWithImage:currentFilteredVideoFrame];
& & imagev.frame=self.view.frame;
& & [self.viewaddSubview:imagev];
//播放录像滤镜并存储
-(void)videoAndStore{
& & NSString *path=[[NSBundlemainBundle]pathForResource:@&sample_iPod.m4v&ofType:nil];
& & NSURL *url=[NSURLfileURLWithPath:path];
&GPUImageMovie * & movie = [[GPUImageMoviealloc]
initWithURL:url];
//& & self.movie=
& & movie.shouldRepeat =YES;//控制视频是否循环播放。
& & movie.playAtActualSpeed
= YES;//控制GPUImageView预览视频时的速度是否要保持真实的速度。如果设为NO,则会将视频的所有帧无间隔渲染,导致速度非常快。设为YES,则会根据视频本身时长计算出每帧的时间间隔,然后每渲染一帧,就sleep一个时间间隔,从而达到正常的播放速度。
//& & movie.playSound = YES;
& & movie.delegate =self;
& & GPUImagePixellateFilter *filter = [[GPUImagePixellateFilteralloc]
init];//胶片效果
& & [movie addTarget:filter];
& & [filter addTarget:(GPUImageView *)self.view];
& & [movie startProcessing];
//添加滤镜组
-(void)addManyFilter{
& & // 图片输入源
&& UIImage* _inputImage = [UIImageimageNamed:@&shensu.jpg&];
& & // 初始化 picture
&& GPUImagePicture* _picture& & = [[GPUImagePicturealloc]
initWithImage:_inputImagesmoothlyScaleOutput:YES];
//& & // 初始化 imageView用于显示滤镜
// & GPUImageView* _imageView& = [[GPUImageView alloc] initWithFrame:self.view.bounds];
//& & [self.view addSubview:_imageView];
& & // 初始化 filterGroup
&& GPUImageFilterGroup* _filterGroup = [[GPUImageFilterGroupalloc]
& & self._filterGroup=_filterG
& & [_picture addTarget:_filterGroup];
& & // 添加 filter
&& & 原理:步骤--
&& & 1. filterGroup(addFilter) 滤镜组添加每个滤镜。
&& & 2. 按添加顺序(可自行调整)前一个filter(addTarget)添加后一个filter
&& & 3. filterGroup.initialFilters = @[第一个filter]];---这一步是在组里面从第一个开始处理滤镜。
&& & 4. filterGroup.terminalFilter = 最后一个//设置最后一个滤镜,即最上面的滤镜。
& & GPUImageRGBFilter *filter1 & & & & = [[GPUImageRGBFilteralloc]
& & GPUImageToonFilter *filter2& & & & = [[GPUImageToonFilteralloc]
& & GPUImageColorInvertFilter *filter3 = [[GPUImageColorInvertFilteralloc]
& & GPUImageSepiaFilter & & & *filter4 = [[GPUImageSepiaFilteralloc]
& & [selfaddGPUImageFilter:filter1];
& & [selfaddGPUImageFilter:filter2];
& & [selfaddGPUImageFilter:filter3];
& & [selfaddGPUImageFilter:filter4];
& & // 处理图片
& & [_picture processImage];
& & [_filterGroup useNextFrameForImageCapture];
UIImage *imag= [_filterGroupimageFromCurrentFramebuffer];
& & UIImageView *imageV=[[UIImageViewalloc]initWithFrame:self.view.frame];
& & imageV.image=
& & [self.viewaddSubview:imageV];
//添加到滤镜组
- (void)addGPUImageFilter:(GPUImageOutput&GPUImageInput& *)filter
& & [self._filterGroupaddFilter:filter];//滤镜组添加滤镜
& & GPUImageOutput&GPUImageInput& *newTerminalFilter =//新的结尾滤镜
& & NSInteger count =self._filterGroup.filterCount;//滤镜组里面的滤镜数量
& & if (count ==1)
& & & & self._filterGroup.initialFilters =@[newTerminalFilter];//在组里面处理滤镜
& & & & self._filterGroup.terminalFilter = newTerminalF//最后一个滤镜,即最上面的滤镜
& & } else
& & & & GPUImageOutput&GPUImageInput& *terminalFilter& & =self._filterGroup.terminalFilter;
& & & & NSArray *initialFilters& & & & & & & & & & & & & =self._filterGroup.initialFilters;
& & & & [terminalFilter addTarget:newTerminalFilter];//逐层吧新的滤镜加到组里最上面
& & & & self._filterGroup.initialFilters =@[initialFilters[0]];
& & & & self._filterGroup.terminalFilter = newTerminalF
////自定义滤镜----左边的shad.fsh中就是自定义的滤镜
//自定义滤镜--------给图片添加单个滤镜,自动添加滤镜
-(void)AutoDefineSingleimageFilter{
& & UIImage *inputImage = [UIImageimageNamed:@&shensu.jpg&];
& & GPUImageFilter *stillImageFilter2=[[GPUImageFilteralloc]initWithFragmentShaderFromFile:@&shad&];//shad是自定义的滤镜shad.fsh
& & UIImage *currentFilteredVideoFrame = [stillImageFilter2imageByFilteringImage:inputImage];
& & UIImageView *imagev=[[UIImageViewalloc]initWithImage:currentFilteredVideoFrame];
& & imagev.frame=self.view.frame;
& & [self.viewaddSubview:imagev];
/**滤镜的制作:加一层调制好的调色调光的模板,GUPImage里有一张标准图lookup.
&设计师用 Photoshop调出来的色彩效果输出在了这种「格子图」上,在 App里通过解析「格子图」得到了色彩的变化规则,然后把这个规则应用在了图片/视频上,这种规则就是一种滤镜的算法。注意,这里只能进行颜色上的调整(曲线,色彩平衡等),其他效果调整也只限于利用图层间混合模式的更改,例如可做暗角、漏光等效果。
&GPUImage中自带三种这样的滤镜GPUImageAmatorkaFilter、GPUImageMissEtikateFilter、GPUImageSoftEleganceFilter.
&使用这三种滤镜需要导入左边sources中相应的图片,lookup.png是基本图,其他的图都是在lookup.png的基础上设计出来的
&根据这样的方法,把标准图给设计师,设计师添加完产品需要的调色动作,把新图导入程序,调用GPUImage中的方法,就得到了想要的滤镜。
//以上三种特殊的滤镜-----左边Resources文件夹中是图片
-(void)GPUImageAmatorkaFilterTest{
& & UIImage *inputImage = [UIImageimageNamed:@&shensu.jpg&];
//& & GPUImageAmatorkaFilter *stillImageFilter2=[[GPUImageAmatorkaFilter alloc]init];//需要导入左侧sources中lookup_amatorka.png图片,才生效
//& & GPUImageMissEtikateFilter *stillImageFilter2=[[GPUImageMissEtikateFilter alloc]init];//需要导入左侧sources中lookup_miss_etikate.png图片,才生效
& & GPUImageSoftEleganceFilter *stillImageFilter2=[[GPUImageSoftEleganceFilteralloc]init];//需要导入左侧sources中lookup_soft_elegance_1.png和lookup_soft_elegance_2.png图片,才生效
& & UIImage *currentFilteredVideoFrame = [stillImageFilter2imageByFilteringImage:inputImage];
& & UIImageView *imagev=[[UIImageViewalloc]initWithImage:currentFilteredVideoFrame];
& & imagev.frame=self.view.frame;
& & [self.viewaddSubview:imagev];
//渲染后存储到本地
-(void)writeToFile{
& & & & NSString *path=[[NSBundle
mainBundle]pathForResource:@&sample_iPod.m4v&
ofType:nil];
& & NSURL *sampleURL=[NSURL
fileURLWithPath:path];
&& GPUImageMovie* movieFile = [[GPUImageMovie
alloc] initWithURL:sampleURL];
&& GPUImagePixellateFilter* pixellateFilter = [[GPUImagePixellateFilter
& & [movieFile addTarget:pixellateFilter];
& & NSString *pathToMovie = [NSHomeDirectory()
stringByAppendingPathComponent:@&Documents/Movie.m4v&];
& & unlink([pathToMovie
UTF8String]);
& & NSURL *movieURL = [NSURL
fileURLWithPath:pathToMovie];
& GPUImageMovieWriter*& movieWriter = [[GPUImageMovieWriter
alloc] initWithMovieURL:movieURL
size:CGSizeMake(480.0,
& & [pixellateFilter addTarget:movieWriter];
& & movieWriter.shouldPassthroughAudio =
& & movieFile.audioEncodingTarget = movieW
& & [movieFile enableSynchronizedEncodingUsingMovieWriter:movieWriter];//允许渲染后保存
& & [movieWriter startRecording];
& & [movieFile startProcessing];
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
& & returnYES;
// Support all orientations.
本文已收录于以下专栏:
相关文章推荐
分别使用CPU、CoreImage、GPU
CPU为图片添加滤镜代码@
CoreImage为图片添加滤镜代码@
GPUImage为图片添加滤镜代码@
demo地址:分别使用CPU、CoreImage...
iOS5给我们带来了很多很好很强大的功能和API。Core Image就是其中之一,它使我们很容易就能处理图片的各种效果,色彩啊,曝光啊,饱和度啊,变形啊神马的。
可惜苹果一直没能完善官方文档,也没...
SDWebImage框架图片处理框架
包含的功能:图片下载、图片缓存、下载进度监听、gif处理等等
用法极其简单,功能十分强大,大大提高了网络图片的处理效率
国内超过90%的iOS项目都有它的影...
在我们日常的开发过程中,我们免不了要跟图片打交道,尤其是网络图片,在我们处理这些问题的时候,较为常见的会遇到这样几个问题:一是OOM内存溢出,二是图片尺寸与缩略图处理的平衡,三是网络图片的加载与缓存机...
图片处理是当今软件开发中非常重要的一环,然而处理图片的开源框架却并不多。现金网上流传的Java处理图片的代码,虽然可对图片进行简单处理,但效果并不理想。虽然也有些其他解决方案,但都摆脱不了繁琐,使用起...
Glide 一个专注于平滑滚动的图片加载和缓存库
Fresco是Facebook最新推出的一款用于Android应用中展示图片的强大图片库,可以从网络、本地存储和本地资源中加载图片。相对于ImageLoader,拥有更快的图片下载速度以及可以加载和显...
他的最新文章
讲师:吴岸城
您举报文章:
举报原因:
原文地址:
原因补充:
(最多只允许输入30个字)

我要回帖

更多关于 win10 自定义分辨率 的文章

 

随机推荐