GPUImage教程(一)安裝,使用例子, 原理和內建濾鏡列表
阿新 • • 發佈:2018-12-30
一. 安裝: Adding the framework to your iOS project 1. 把GPUImage.xcodeproj 拖到你的Xcode project 2. 在app的target依賴設定裡面新增GPUImage作為Target Dependency 3. 在build phase的Link Binary With Libraries, 把libGPUImage.a加進來. 4. 新增下面這些系統framework:
- CoreMedia
- CoreVideo
- OpenGLES
- AVFoundation
-
QuartzCore
5. 標頭檔案搜尋路徑: project's build settings, 把GPUImage的source和source下的iOS目錄加到搜尋路徑裡, 使用相對路徑和遞迴.
- #import "GPUImage.h"
二. 靜態庫方法 Building static library at the command line If you don't want to include the project as a dependency in your application's Xcode project, you can build a universal static library for the iOS Simulator or device. To do this, run build.sh at the command line. The resulting library and header files will be located at build/Release-iphone. You may also change the version of the iOS SDK by changing the IOSSDK_VER variable in build.sh (all available versions can be found using xcodebuild -showsdks).
第二部分: 使用 一. Filtering live video
-
GPUImageVideoCamera *videoCamera = [[GPUImageVideoCamera alloc] initWithSessionPreset:AVCaptureSessionPreset640x480 cameraPosition:AVCaptureDevicePositionBack];
-
videoCamera.outputImageOrientation = UIInterfaceOrientationPortrait;
-
GPUImageFilter *customFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"CustomShader"];
-
GPUImageView *filteredVideoView = [[GPUImageView alloc] initWithFrame:CGRectMake(0.0, 0.0, viewWidth, viewHeight)];
-
// Add the view somewhere so it's visible
-
[videoCamera addTarget:customFilter];
-
[customFilter addTarget:filteredVideoView];
- [videoCamera startCameraCapture];
- videoCamera.audioEncodingTarget = movieWriter;
二. Capturing and filtering a still photo 相機預覽程式碼: (此時雖然是相機模式, 仍然會給出一個still camera的預覽視訊)
-
stillCamera = [[GPUImageStillCamera alloc] init];
-
stillCamera.outputImageOrientation = UIInterfaceOrientationPortrait;
-
filter = [[GPUImageGammaFilter alloc] init];
-
[stillCamera addTarget:filter];
-
GPUImageView *filterView = (GPUImageView *)self.view;
-
[filter addTarget:filterView];
- [stillCamera startCameraCapture];
-
[stillCamera capturePhotoProcessedUpToFilter:filter withCompletionHandler:^(UIImage *processedImage, NSError *error){
-
NSData *dataForPNGFile = UIImageJPEGRepresentation(processedImage, 0.8);
-
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
-
NSString *documentsDirectory = [paths objectAtIndex:0];
-
NSError *error2 = nil;
-
if (![dataForPNGFile writeToFile:[documentsDirectory stringByAppendingPathComponent:@"FilteredPhoto.jpg"] options:NSAtomicWrite error:&error2])
-
{
-
return;
-
}
- }];
-
UIImage *inputImage = [UIImage imageNamed:@"Lambeau.jpg"];
-
GPUImagePicture *stillImageSource = [[GPUImagePicture alloc] initWithImage:inputImage];
-
GPUImageSepiaFilter *stillImageFilter = [[GPUImageSepiaFilter alloc] init];
-
[stillImageSource addTarget:stillImageFilter];
-
[stillImageSource processImage];
- UIImage *currentFilteredVideoFrame = [stillImageFilter imageFromCurrentlyProcessedOutput];
-
GPUImageSepiaFilter *stillImageFilter2 = [[GPUImageSepiaFilter alloc] init];
-
UIImage *quickFilteredImage = [stillImageFilter2 imageByFilteringImage:inputImage];
從bundle裡面載入OpenGL Shading Language編寫的 fragment shader檔案, 字尾是 .fsh 或者從字串裡面載入.
- GPUImageFilter *customFilter = [[GPUImageFilter alloc] initWithFragmentShaderFromFile:@"CustomShader"];
-
NSString *const kfilterShader = SHADER_STRING
-
(
-
...
- );
-
varying highp vec2 textureCoordinate;
-
uniform sampler2D inputImageTexture;
-
void main()
-
{
-
lowp vec4 textureColor = texture2D(inputImageTexture, textureCoordinate);
-
lowp vec4 outputColor;
-
outputColor.r = (textureColor.r * 0.393) + (textureColor.g * 0.769) + (textureColor.b * 0.189);
-
outputColor.g = (textureColor.r * 0.349) + (textureColor.g * 0.686) + (textureColor.b * 0.168);
-
outputColor.b = (textureColor.r * 0.272) + (textureColor.g * 0.534) + (textureColor.b * 0.131);
-
outputColor.a = 1.0;
-
gl_FragColor = outputColor;
- }
-
movieFile = [[GPUImageMovie alloc] initWithURL:sampleURL];
-
pixellateFilter = [[GPUImagePixellateFilter alloc] init];
-
[movieFile addTarget:pixellateFilter];
-
NSString *pathToMovie = [NSHomeDirectory() stringByAppendingPathComponent:@"Documents/Movie.m4v"];
-
unlink([pathToMovie UTF8String]);
-
NSURL *movieURL = [NSURL fileURLWithPath:pathToMovie];
-
movieWriter = [[GPUImageMovieWriter alloc] initWithMovieURL:movieURL size:CGSizeMake(480.0, 640.0)];
-
[pixellateFilter addTarget:movieWriter];
-
movieWriter.shouldPassthroughAudio = YES;
-
movieFile.audioEncodingTarget = movieWriter;
-
[movieFile enableSynchronizedEncodingUsingMovieWriter:movieWriter];
-
[movieWriter startRecording];
- [movieFile startProcessing];
結束的時候停止程式碼:
-
[pixellateFilter removeTarget:movieWriter];
- [movieWriter finishRecording];
六. Interacting with OpenGL ES
GPUImage使用GPUImageTextureOutput 和 GPUImageTextureInput 想Open GL ES 2.0輸出或者輸入材質, 可用把GPUImage的輸出作為OpenGL的材質輸入, 或者把OpenGL的輸出作為自己的材質輸入. 例子程式碼正在整理中
第三部分, 原理
GPUImage是一個鏈(chain), source -> phase1 target -> phase2 target -> final target
第一個環節是source, 這是一些GPUImageOutput的子類.包括:
(1). GPUImageVideoCamera (for live video from an iOS camera)
(2.) GPUImageStillCamera (for taking photos with the camera)
(3). GPUImagePicture (for still images)
(4). GPUImageMovie (for movies). S
後續環節是被稱為target. 遵循GPUImageInput protocol
可用多個source到一個target上面進行blend, 也可用進行分支, 新增多個target.
一般的target可分為兩類
(1)中間環節的target, 一般是各種filter, 是GPUImageFilter或者是子類.
(2)最終環節的target, 可用是GPUImageView, 或者GPUImageMovieWriter
一個典型的例子
- GPUImageVideoCamera -> GPUImageSepiaFilter -> GPUImageView
共125個濾鏡, 分為四類
Color adjustments: 31 filters, 顏色處理相關
Image processing: 40 filters, 影象處理相關.
Blending modes: 29 filters, 混合模式相關.
Visual effects: 25 filters, 視覺效果相關.
下面分別列出車125個濾鏡的名字, 後續再對每個專題進行講解.
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