? iOS 使用GPUImage實現濾鏡效果

ylyk5972 7年前發布 | 18K 次閱讀 GPUImage iOS開發 移動開發

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

 

 本文由用戶 ylyk5972 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!