GPUImage

GPUImage是Brad Larson在github託管的開源項目。

GPUImage是一個基於GPU圖像和視頻處理的開源iOS框架,提供各種各樣的圖像處理濾鏡,並且支持照相機和攝像機的實時濾鏡; 基於GPU的圖像加速,因此可以加速對實時攝像頭視頻、電影以及image的濾鏡和其它效果處理,並且能夠自定義圖像濾鏡。另外, GPUImage支持ARC。

使用GPUImage處理圖片比Core Image更簡單,只需要將過濾器賦給圖片對象即可,不用考慮context或者設備等其他問題。GPUImage提供了除高斯模糊外的其他幾種不同效果的模糊,雖然Core Image也提供了幾種模糊效果,但目前在iOS上能用的就只有高斯模糊,而GPUImage可用的有FastBlur, GaussianBlur, GaussianSelectiveBlur 和 BoxBlur。此外,作爲開源框架的GPUImage還支持自定義的過濾器。

GPUImage是一個活躍的iOS上基於GPU的圖像處理庫。它在這個網站中的十佳iOS庫中贏得了一席之地!

GPUImage隱藏了在iOS中所有需要使用OpenGL ES的複雜的代碼,並用極其簡單的接口以很快的速度處理圖像。GPUImage的性能甚至在很多時候擊敗了Core Image,但是Core Image仍然在很多函數中有優勢。

在開始學習GPUImage之前,你需要把它包含到你的項目中。這可以使用Cocoapods在項目中生成靜態庫或直接嵌入源碼來完成。

項目應用已經包含一個建立在外部的靜態框架。你可以根據下面的步驟簡單的把它複製到項目中:

說明:

在命令行中運行build.sh。生成的庫和頭文件將會被放在build/Release-iphone。

你也可以通過修改build.sh中的IOSSDK_VER變量來修改iOS SDK的版本(你可以通過使用xcodebuild -showsdks來查看所有可用的版本)。

你可以通過下面來自Github倉庫的說明把源代碼嵌入你的項目:

說明:

拖拽GPUImage.xcodeproj文件到你Xcode項目中來把框架嵌入到你的項目中。

然後,到應用程序的target添加GPUImage爲一個target依賴。

從GPUImage框架新產品文件夾中拖拽libGPUImage.a庫到你應用程序target中的Link Binary With Librariesbuild phase。

GPUImage需要鏈接一些其他框架到你的應用程序,所以你需要添加如下的相關庫到你的應用程序target:

CoreMedia

CoreVideo

OpenGLES

AVFoundation

QuartzCore

然後你需要找到框架的頭文件。在你項目的build設置中,設置Header Search Paths的相對路徑爲你應用程序中框架/子文件夾中的GPUImage源文件目錄。使Header Search Paths是遞歸的。

添加GPUImage到你的項目中後,一定要在ImageProcessor.m中包含頭文件。

如果你想包含靜態的框架,使用#import GPUImage/GPUImage.h。如果你想直接在項目中包含它,使用#import “GPUImage.h”。

添加新的處理函數到ImageProcessor.m中:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
- (UIImage *)processUsingGPUImage:(UIImage*)input {
  // 1. Create the GPUImagePictures
  GPUImagePicture * inputGPUImage = [[GPUImagePicture alloc] initWithImage:input];
  UIImage * ghostImage = [self createPaddedGhostImageWithSize:input.size];
  GPUImagePicture * ghostGPUImage = [[GPUImagePicture alloc] initWithImage:ghostImage];
  // 2. Set up the filter chain
  GPUImageAlphaBlendFilter * alphaBlendFilter = [[GPUImageAlphaBlendFilter alloc] init];
  alphaBlendFilter.mix = 0.5;
  [inputGPUImage addTarget:alphaBlendFilter atTextureLocation:0];
  [ghostGPUImage addTarget:alphaBlendFilter atTextureLocation:1];
  GPUImageGrayscaleFilter * grayscaleFilter = [[GPUImageGrayscaleFilter alloc] init];
  [alphaBlendFilter addTarget:grayscaleFilter];
  // 3. Process & grab output image
  [grayscaleFilter useNextFrameForImageCapture];
  [inputGPUImage processImage];
  [ghostGPUImage processImage];
  UIImage * output = [grayscaleFilter imageFromCurrentFramebuffer];
  return output;
}

嘿!它看來很明確。這是它的具體內容:

創建GPUImagePicture對象;再次使用-createPaddedGhostImageWithSize:爲一個工具。這時GPUImage會把圖像紋理上傳到GPU內存。

創建和鏈接你將要使用的濾鏡。這種鏈接與Core Image中的濾鏡鏈接不同,它類似於管道。在你完成後,它看起來是這樣的:

GPUFilterChain-283x320.png

GPUImageAlphaBlendFilter接受兩個輸入,在這種情況下爲頂部和底部的圖像,紋理的位置很重要。-addTarget:atTextureLocation: 設置紋理爲正確的輸入(位置)。

在鏈中的最後一個濾鏡調用-useNextFrameForImageCapture然後對兩個輸入調用-processImage 。這可以確保濾鏡知道你想要從中抓取圖像然後持有它。

最後,替換processImage的第一行代碼: 來調用新的函數:

1
UIImage * outputImage = [self processUsingGPUImage:inputImage];

就是這樣。生成並運行。幽靈看起來和往常一樣好!

57.png

正如你看到的,GPUImage很容易操作。你也可以在GLSL裏製作你自己的着色器並創建你自己的濾鏡。查看這裏的GPUImage文檔來更多的學習如何使用本框架。

在這裏下載本節項目中的所有代碼。

下一步?


發佈了62 篇原創文章 · 獲贊 3 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章