? iOS 使用GPUImage實現濾鏡效果
GPUImage實現濾鏡效果
GPUImage是一個開源的圖像處理第三方庫,提供了100多種濾鏡效果來加工處理圖片,功能很強大,簡單的介紹一下使用方法:
1.從github下載GPUImage,打開iOS工程
2.Command+B編譯,libGPUImage.a右鍵show In finder中復制一份靜態庫
這個時候可以驗證一下.a靜態庫中是否包含全了真機指令集,不全的話打包會出問題,想打包起碼支持armv7(armv7s兼容),arm64
終端->:heavy_dollar_sign:cd到libGPUImage.a所在的目錄 -> :heavy_dollar_sign:lipo –info libGPUImage.a 查看當前指令集
如果發現不全,可通過這個位置調整后重新編譯獲取.a靜態庫
3.這里最好是做一步真機和模擬器靜態庫的合并,不然只跑真機模擬器跑步起來也挺不方便.
lipo –create /Users/ddd/Downloads/GPUImage-master/build/Debug-iphoneos/libGPUImage.a/Users/ddd/Downloads/GPUImage-master/build/Debug-iphonesimulator/libGPUImage.a –output /Users/ddd/Desktop/trumk12-2/framework/libGPUimage.a
(即lipo –create 真機庫路徑 模擬器庫路徑 –output 保存路徑)
再次查看:heavy_dollar_sign:lipo –info libGPUImage.a查看如下圖即可
4.在自己的項目中拖libGPUImage.a和所需要的類(可以全部導入)
5.開始實現代碼:
//圖片的濾鏡效果
func hightLightImage(image:UIImage,type:Int) -> UIImage {
switch type {
case 1:
//中間突出 四周暗
// let passthroughFilter = GPUImageLookupFilter()
// passthroughFilter.intensity = 0.5
let passthroughFilter = GPUImageVignetteFilter()
// passthroughFilter.contrast = 0.1
//設置要渲染的區域
passthroughFilter.forceProcessingAtSize(image.size)
passthroughFilter.useNextFrameForImageCapture()
//獲取數據源
let stillImageSource = GPUImagePicture(image:image)
stillImageSource.addTarget(passthroughFilter)
//開始渲染
stillImageSource.processImage()
let finallImage = passthroughFilter.imageFromCurrentFramebuffer()
return finallImage
case 2:
//紅
let passthroughFilter = GPUImageRGBFilter()
passthroughFilter.red = 0.9
passthroughFilter.green = 0.8
passthroughFilter.blue = 0.9
//設置要渲染的區域
passthroughFilter.forceProcessingAtSize(image.size)
passthroughFilter.useNextFrameForImageCapture()
//獲取數據源
let stillImageSource = GPUImagePicture(image:image)
stillImageSource.addTarget(passthroughFilter)
//開始渲染
stillImageSource.processImage()
let finallImage = passthroughFilter.imageFromCurrentFramebuffer()
return finallImage
case 3:
//藍
let passthroughFilter = GPUImageRGBFilter()
passthroughFilter.red = 0.8
passthroughFilter.green = 0.8
passthroughFilter.blue = 0.9
//設置要渲染的區域
passthroughFilter.forceProcessingAtSize(image.size)
passthroughFilter.useNextFrameForImageCapture()
//獲取數據源
let stillImageSource = GPUImagePicture(image:image)
stillImageSource.addTarget(passthroughFilter)
//開始渲染
stillImageSource.processImage()
let finallImage = passthroughFilter.imageFromCurrentFramebuffer()
return finallImage
case 4:
//綠
let passthroughFilter = GPUImageRGBFilter()
passthroughFilter.red = 0.8
passthroughFilter.green = 0.9
passthroughFilter.blue = 0.8
//設置要渲染的區域
passthroughFilter.forceProcessingAtSize(image.size)
passthroughFilter.useNextFrameForImageCapture()
//獲取數據源
let stillImageSource = GPUImagePicture(image:image)
stillImageSource.addTarget(passthroughFilter)
//開始渲染
stillImageSource.processImage()
let finallImage = passthroughFilter.imageFromCurrentFramebuffer()
return finallImage
case 5:
//懷舊
let passthroughFilter = GPUImageSepiaFilter()
//設置要渲染的區域
passthroughFilter.forceProcessingAtSize(image.size)
passthroughFilter.useNextFrameForImageCapture()
//獲取數據源
let stillImageSource = GPUImagePicture(image:image)
stillImageSource.addTarget(passthroughFilter)
//開始渲染
stillImageSource.processImage()
let finallImage = passthroughFilter.imageFromCurrentFramebuffer()
return finallImage
case 6:
//朦朧加暗
let passthroughFilter = GPUImageHazeFilter()
//設置要渲染的區域
passthroughFilter.forceProcessingAtSize(image.size)
passthroughFilter.useNextFrameForImageCapture()
//獲取數據源
let stillImageSource = GPUImagePicture(image:image)
stillImageSource.addTarget(passthroughFilter)
//開始渲染
stillImageSource.processImage()
let finallImage = passthroughFilter.imageFromCurrentFramebuffer()
return finallImage
case 7:
//飽和
let passthroughFilter = GPUImageSaturationFilter()
passthroughFilter.saturation = 1.5
//設置要渲染的區域
passthroughFilter.forceProcessingAtSize(image.size)
passthroughFilter.useNextFrameForImageCapture()
//獲取數據源
let stillImageSource = GPUImagePicture(image:image)
stillImageSource.addTarget(passthroughFilter)
//開始渲染
stillImageSource.processImage()
let finallImage = passthroughFilter.imageFromCurrentFramebuffer()
return finallImage
case 8:
//亮度
//創建一個亮度的濾鏡
let passthroughFilter = GPUImageBrightnessFilter()
passthroughFilter.brightness = 0.2
//設置要渲染的區域
passthroughFilter.forceProcessingAtSize(image.size)
passthroughFilter.useNextFrameForImageCapture()
//獲取數據源
let stillImageSource = GPUImagePicture(image:image)
stillImageSource.addTarget(passthroughFilter)
//開始渲染
stillImageSource.processImage()
let finallImage = passthroughFilter.imageFromCurrentFramebuffer()
return finallImage
case 9:
//曝光度
//創建一個亮度的濾鏡
let passthroughFilter = GPUImageExposureFilter()
passthroughFilter.exposure = 0.15
//設置要渲染的區域
passthroughFilter.forceProcessingAtSize(image.size)
passthroughFilter.useNextFrameForImageCapture()
//獲取數據源
let stillImageSource = GPUImagePicture(image:image)
stillImageSource.addTarget(passthroughFilter)
//開始渲染
stillImageSource.processImage()
let finallImage = passthroughFilter.imageFromCurrentFramebuffer()
return finallImage
case 10:
//素描
let passthroughFilter = GPUImageSketchFilter()
//設置要渲染的區域
passthroughFilter.forceProcessingAtSize(image.size)
passthroughFilter.useNextFrameForImageCapture()
//獲取數據源
let stillImageSource = GPUImagePicture(image:image)
stillImageSource.addTarget(passthroughFilter)
//開始渲染
stillImageSource.processImage()
let finallImage = passthroughFilter.imageFromCurrentFramebuffer()
return finallImage
case 11:
//卡通
let passthroughFilter = GPUImageSmoothToonFilter()
passthroughFilter.blurRadiusInPixels = 0.5
//設置要渲染的區域
passthroughFilter.forceProcessingAtSize(image.size)
passthroughFilter.useNextFrameForImageCapture()
//獲取數據源
let stillImageSource = GPUImagePicture(image:image)
stillImageSource.addTarget(passthroughFilter)
//開始渲染
stillImageSource.processImage()
let finallImage = passthroughFilter.imageFromCurrentFramebuffer()
return finallImage
default:
return image
}
}
還有可能出現的一種情況是,如果不是從相冊獲取而是直接拍照獲得時拿到的圖片有可能是發生偏轉90度的( 網上說法:用相機拍攝出來的照片含有EXIF信息,UIImage的imageOrientation屬性指的就是EXIF中的orientation信息。如果我們忽略orientation信息,而直接對照片進行像素處理或者drawInRect等操作,得到的結果是翻轉或者旋轉90之后的樣子。這是因為我們執行像素處理或者drawInRect等操作之后,imageOrientaion信息被刪除了,imageOrientaion被重設為0,造成照片內容和imageOrientaion不匹配。所以,在對照片進行處理之前,先將照片旋轉到正確的方向,并且返回的imageOrientaion為0。)
通過以下方法可以解決:
//防圖片90度
func fixOrientation(img:UIImage) -> UIImage {
if (img.imageOrientation == UIImageOrientation.Up) {
return img;
}
UIGraphicsBeginImageContextWithOptions(img.size, false, img.scale);
let rect = CGRect(x: 0, y: 0, width: img.size.width, height: img.size.height)
img.drawInRect(rect)
let normalizedImage : UIImage = UIGraphicsGetImageFromCurrentImageContext()!
UIGraphicsEndImageContext();
return normalizedImage;
}
附帶一張效果圖:
來自:http://www.jianshu.com/p/51786bcc30bf