Core Image簡介與使用


Core Image是一個很強大的框架。它可以讓你簡單地應用各種濾鏡來處理圖像,比如修改鮮艷程度, 色澤, 或者曝光,對圖像進行濾鏡操作,比如模糊、顏色改變、銳化、人臉識別等。 它利用GPU(或者CPU)來非常快速、甚至實時地處理圖像數據和視頻的幀。並且隱藏了底層圖形處理的所有細節,通過提供的API就能簡單的使用了,無須關心OpenGL或者OpenGL ES是如何充分利用GPU的能力的,也不需要你知道GCD在其中發揮了怎樣的作用,Core Image處理了全部的細節

 

 一、 Core Image介紹

 我們可以將CIImage對象與其他核心圖像類(如CIFilter、CIContext、CIVector和cicoll)結合使用,以便在處理圖像時利用內置的核心圖像濾鏡。您可以使用各種來源提供的數據創建CIImage對象,包括Quartz 2D圖像、核心視頻圖像緩沖區(CVImageBuffer)、基於url的對象和NSData對象

 盡管CIImage對象具有與其關聯的圖像數據,但它不是一個圖像。您可以將CIImage對象看作映像“菜譜”。CIImage對象擁有生成圖像所需的所有信息,但是Core image在被告知之前並不實際呈現圖像。這種惰性計算允許Core Image盡可能高效地運行。

 CIContext 和 CIImage 對象是不可變的,這意味着它們可以在線程之間安全地共享。多線程可以使用相同的GPU或CPU CIContext 對象來渲染 CIImage 對象。但是,CIFilter 對象不是這樣的,它是可變的。不能在線程之間安全地共享 CIFilter 對象。如果你的應用程序是多線程的,每個線程必須創建自己的CIFilter對象。否則,app可能會出現意外的表現。

 CoreImage還提供自動調整方法。這些方法分析圖像的常見缺陷,並返回一組過濾器來糾正這些缺陷。濾鏡預設了一些值,用於通過改變膚色、飽和度、對比度和陰影的值來改善圖像質量,並用於消除由閃光燈引起的紅眼或其他偽影。(參見獲得自動調整濾鏡。)

 1.框架介紹

 (1)CoreImage

 (2)是一個圖片框架

 它基於OpenGL頂層創建

 底層則用着色器來處理圖像

 (3)他利用了GPU基於硬件加速來處理圖像

 (4)CoreImage中有很多濾鏡

 (5)它們能夠一次給予一張圖像或者視頻幀多種視覺效果 -> 濾鏡鏈

 (6)而且濾鏡可以連接起來組成一個濾鏡鏈 把濾鏡效果疊加起來處理圖像

 

 2.類的介紹

 1.CIImage 保存圖像數據的類

 CGImageRef->圖像中的數據

 2.CIFilter 濾鏡類

 圖片屬性進行細節處理的類

 它對所有的像素進行操作 用鍵-值(KVC)來設置

 3.CIContext 上下文是實現對圖像處理的具體對象 用來把濾鏡和圖片合成成為一張圖片 濾鏡對象輸出的圖像並不是合成之后的圖像,需要使用圖片處理的上下文 合並輸出圖像

 接下來就是他系統內部的效果分類,效果分類就不在這里一一羅列出來了,因為這里根本寫不下,可以點進CIFilter里,然后找到128行,從這里開始,可以一一了解一下這些效果。

 然后我們就可以做一個圖片處理的效果,我們處理圖片的原理上面給大家說過了,就是給他添加了一個濾鏡,CIFilter,來使他的視圖發生一些變化。

 在這里我們雖然展示在視圖上的仍然是UIImageView上面的image,但是我們做處理的時候使用的是CIImage。然后我們需要找到我們需要的效果類,在CIFilter中查詢我們需要的效果類,這里直接上代碼給大家解釋,因為在找效果類的時候比較復雜。

 

 二、使用CoreImage濾鏡

1.創建CIImage,創建一個imageview接受處理后的圖片

override func viewDidLoad() {
        super.viewDidLoad()

        view.backgroundColor = .white
        //創建一個imageview接受處理后的圖片
        imageView =  UIImageView(frame: CGRect(x: 0, y: 100, width: view.frame.width, height: view.frame.height - 100))
        view.addSubview(imageView)
        
        filterImage()
    }
    
    func filterImage() {
    
        let path = Bundle.main.path(forResource: "image", ofType: "jpg") ?? ""
        let imageURL = URL(fileURLWithPath: path)
        let originalCIImage = CIImage(contentsOf: imageURL)!
        let filters = originalCIImage.autoAdjustmentFilters()//自動調整濾鏡
        print(filters)
//        self.imageView.image = UIImage(ciImage:scaleFilter(originalCIImage)!)
//        self.imageView.image = createCode(codeType: "CIQRCodeGenerator", codeString: "hello", size: CGSize(width: 300, height: 300), qrColor: .black, bkColor: .white)
        self.imageView.image = UIImage(ciImage:colorCurvesFilter(originalCIImage)!)
//        self.imageView.image = UIImage(ciImage:colorControlFilter(originalCIImage)!)
    }

2.濾鏡使用--高斯模糊濾鏡

func filterTest(_ input: CIImage)->CIImage? {
        //        CIFilter.filterNames(inCategory: "")//獲取所有濾鏡名
        let filter = CIFilter(name: "CIGaussianBlur")
        filter?.setValue(input, forKey: kCIInputImageKey)
        filter?.setValue(5, forKey: kCIInputRadiusKey)
        print(filter!.attributes)//獲取某一濾鏡的所有屬性
        print(filter!.inputKeys)//獲取某一屬性的所有輸入項
        
        return filter?.outputImage
    }

3.顏色控制濾鏡

func colorControlFilter(_ input: CIImage) -> CIImage?
    {
        let sepiaFilter = CIFilter(name:"CIColorControls")
        
//        print(sepiaFilter?.attributes)
        sepiaFilter?.setValue(input, forKey: kCIInputImageKey)
        sepiaFilter?.setValue(NSNumber(1), forKey: "inputSaturation")//飽和度
        sepiaFilter?.setValue(NSNumber(1), forKey: "inputBrightness")//亮度
        sepiaFilter?.setValue(NSNumber(3), forKey: "inputContrast")//對比度
        return sepiaFilter?.outputImage
    }

4.生成二維碼生成器,CoreImage可以生成二維碼條形碼棋盤等十多種特殊圖像

public func createCode( codeType:String, codeString:String, size:CGSize,qrColor:UIColor,bkColor:UIColor )->UIImage?
    {
        //if #available(iOS 8.0, *)
        
        let stringData = codeString.data(using: String.Encoding.utf8)
        
        
        //系統自帶能生成的碼
        //        CIAztecCodeGenerator
        //        CICode128BarcodeGenerator
        //        CIPDF417BarcodeGenerator
        //        CIQRCodeGenerator
        let qrFilter = CIFilter(name: codeType)
        
//        print(qrFilter?.attributes)
        qrFilter?.setValue(stringData, forKey: "inputMessage")
        qrFilter?.setValue("H", forKey: "inputCorrectionLevel")
        
        
        //上色
        let colorFilter = CIFilter(name: "CIFalseColor", parameters: ["inputImage":qrFilter!.outputImage!,"inputColor0":CIColor(cgColor: qrColor.cgColor),"inputColor1":CIColor(cgColor: bkColor.cgColor)])
        
        
        let qrImage = colorFilter!.outputImage!;
        let logoImage = UIImage(named: "hulu.jpg")!
        
        //繪制
        let cgImage = CIContext().createCGImage(qrImage, from: qrImage.extent)!
        
        UIGraphicsBeginImageContext(size);
        let context = UIGraphicsGetCurrentContext()!;
        context.interpolationQuality = CGInterpolationQuality.none;
        context.scaleBy(x: 1.0, y: -1.0);
        context.draw(cgImage, in: context.boundingBoxOfClipPath)
        let codeImage = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        

        return addlogo(logoImage: logoImage, to: codeImage!)
       
    }
   
    //添加logo
    func addlogo(logoImage:UIImage,to sourceImage:UIImage) -> UIImage? {
        let size = sourceImage.size
        UIGraphicsBeginImageContextWithOptions(size, false, 0)
        sourceImage.draw(at: CGPoint(x: 0, y: 0))
        
        let context1 = UIGraphicsGetCurrentContext()!
        context1.drawPath(using: .stroke)
        let rect = CGRect(x: size.width/2 - 25, y: size.height/2 - 25, width: 50, height: 50)
        context1.clip()
        logoImage.draw(in: rect)
        let codeImage1 = UIGraphicsGetImageFromCurrentImageContext();
        UIGraphicsEndImageContext();
        
        return codeImage1
    }

5.人臉識別,CoreImage可以識別人臉,眼睛嘴巴鼻子等屬性

    CIDetectorAccuracy適用於設置識別精度 CIDetecror 是 coreImage 框架中提供的一個識別類,包括人臉【CIDetectorTypeFace】,形狀【CIDetectorTypeRectangle】,條碼【CIDetectorTypeQRCode】,文本【CIDetectorTypeText】的識別

     具體人臉識別細節可參考https://www.jianshu.com/p/e371099f12bd

func faceFilter(_ input: CIImage){
        //detect face
        let personciImage = input
        let accuracy = [CIDetectorAccuracy: CIDetectorAccuracyHigh]
        let faceDetector = CIDetector(ofType: CIDetectorTypeFace, context: nil, options: accuracy)
        let faces = faceDetector?.features(in: personciImage)
        
        print("------檢測到\(faces!.count)張人臉-------")
        if(faces?.count ?? 0 > 0){
            let face = faces?.first as! CIFaceFeature
            if (face.hasSmile) {
                print("有微笑");
            }
            if (face.leftEyeClosed) {
                print("左眼閉着");
            }
            if (face.rightEyeClosed) {
                print("右眼閉着");
            }
            
            
           
        }
    }

三、Core Image 優勢

  • 官方框架,使用放心,維護方便。
  • 支持 CPU 渲染,可以在后台繼續處理和保存圖片。
  • 一些濾鏡的性能更強勁。例如由 Metal Performance Shaders 支持的模糊濾鏡等。
  • 支持使用 Metal 渲染圖像。而 Metal 在 iOS 平台上有更好的表現。
  • 與 Metal,SpriteKit,SceneKit,Core Animation 等更完美的配合。
  • 支持圖像識別功能。包括人臉識別、條形碼識別、文本識別等。
  • 支持自動增強圖像效果,會分析圖像的直方圖,圖像屬性,臉部區域,然后通過一組濾鏡來改善圖像效果。
  • 支持對原生 RAW 格式圖片的處理。
  • 濾鏡鏈的性能比 GPUImage 高。(沒有驗證過,GPUImage 的主頁上是這么說的)。
  • 支持對大圖進行處理,超過 GPU 紋理限制 (4096 * 4096)的時候,會自動拆分成幾個小塊處理(Automatic tiling)。GPUImage 當處理超過紋理限制的圖像時候,會先做判斷,壓縮成最大紋理限制的圖像,導致圖像質量損失。

四、整理CoreImage分類濾鏡

 -------Category------
 kCICategoryDistortionEffect: String  失真效應
 ["CIBumpDistortion"凹凸變形, "CIBumpDistortionLinear"線性凹凸變形, "CICameraCalibrationLensCorrection"攝像機標定鏡頭校正, "CICircleSplashDistortion"圓形飛濺效果, "CICircularWrap"圓形包裝, "CIDisplacementDistortion"位移變形, "CIDroste", "CIGlassDistortion"玻璃變形, "CIGlassLozenge"菱形玻璃變形, "CIHoleDistortion"孔變形, "CILightTunnel"“光隧道”, "CINinePartStretched"九部分拉伸, "CINinePartTiled"九部分平鋪, "CIPinchDistortion"縮放失真, "CIStretchCrop 拉伸剪裁", "CITorusLensDistortion 環面透鏡失真", "CITwirlDistortion 旋轉失真", "CIVortexDistortion 漩渦失真"]
 kCICategoryGeometryAdjustment:  幾何調整
 ["CIAffineTransform 仿射變換", "CIBicubicScaleTransform 雙三次尺度變換", "CICrop 裁剪", "CIEdgePreserveUpsampleFilter 邊緣保留上樣濾鏡", "CIKeystoneCorrectionCombined 組合梯形校正", "CIKeystoneCorrectionHorizontal 水平梯形校正”", "CIKeystoneCorrectionVertical 垂直梯形校正", "CILanczosScaleTransform 蘭佐斯比例變換", "CIPerspectiveCorrection 透視校正", "CIPerspectiveRotate 透視旋轉", "CIPerspectiveTransform 透視變換", "CIPerspectiveTransformWithExtent 有度透視變換", "CIStraightenFilter 伸直濾鏡"]
 kCICategoryCompositeOperation:  混合
 ["CIAdditionCompositing 加法合成", "CIColorBlendMode 顏色混合", "CIColorBurnBlendMode 顏色燃燒混合", "CIColorDodgeBlendMode 顏色減淡混合", "CIDarkenBlendMode 加深混合", "CIDifferenceBlendMode 差異混合", "CIDivideBlendMode 除法混合", "CIExclusionBlendMode 排斥混合", "CIHardLightBlendMode 強光混合", "CIHueBlendMode 色相混合", "CILightenBlendMode 亮度混合", "CILinearBurnBlendMode 線性燃燒混合", "CILinearDodgeBlendMode 線性減淡混合", "CILuminosityBlendMode 光度混合", "CIMaximumCompositing 最大合成", "CIMinimumCompositing最小合成", "CIMultiplyBlendMode 乘法混合", "CIMultiplyCompositing乘法合成", "CIOverlayBlendMode覆蓋混合", "CIPinLightBlendMode 銷光混合", "CISaturationBlendMode 飽和", "CIScreenBlendMode 屏幕混合", "CISoftLightBlendMode 柔光混合", "CISourceAtopCompositing頂部源合成", "CISourceInCompositing 底部源合成", "CISourceOutCompositing外部源合成", "CISourceOverCompositing內部源合成", "CISubtractBlendMode扣除混合"]
 kCICategoryHalftoneEffect: String  半色調效果
 ["CICircularScreen 圓網", "CICMYKHalftone CMYK 網調", "CIDotScreen 點網", "CIHatchedScreen 孵化網", "CILineScreen 線網"]
 kCICategoryColorAdjustment: String  顏色調整
 ["CIColorClamp", "CIColorControls", "CIColorMatrix", "CIColorPolynomial", "CIDepthToDisparity", "CIDisparityToDepth", "CIExposureAdjust", "CIGammaAdjust", "CIHueAdjust", "CILinearToSRGBToneCurve", "CISRGBToneCurveToLinear", "CITemperatureAndTint", "CIToneCurve", "CIVibrance", "CIWhitePointAdjust"]
 [“顏色夾”、“顏色控制”、“顏色矩陣”、“顏色多項式”、“深度到視差”、“視差到深度”、“曝光調整”、“伽馬調整”、“色調調整”、“線性到SRGB色調曲線”、“SRGB色調曲線到線性”、“溫度和色調”、“色調曲線”、“振動”、“白點調整”]
 kCICategoryColorEffect: String  色彩效果:
 [“顏色交叉多項式”、“顏色立方”、“顏色方塊混合着面具”,“多維數據集與顏色空間”,“顏色曲線”、“顏色反轉”,“彩色地圖”、“顏色單色”、“顏色多色調分色印”、“猶豫”,“文檔增強劑”,“假彩色”、“實驗室DeltaE”,“阿爾法”面具,“最大組件”,“最小組件”、“調色板重心”,“Palettize”、“照片效果Chrome”,“照片效果消退”,“照片即時效果”,“照片效果Mono”,“黑色照片效果”,“照片效應過程”,“照片色調效果”,"光效應轉移""棕褐色""""""暈效應"" x射線"]
 ["CIColorCrossPolynomial", "CIColorCube", "CIColorCubesMixedWithMask", "CIColorCubeWithColorSpace", "CIColorCurves", "CIColorInvert", "CIColorMap", "CIColorMonochrome", "CIColorPosterize", "CIDither", "CIDocumentEnhancer", "CIFalseColor", "CILabDeltaE", "CIMaskToAlpha", "CIMaximumComponent", "CIMinimumComponent", "CIPaletteCentroid", "CIPalettize", "CIPhotoEffectChrome", "CIPhotoEffectFade", "CIPhotoEffectInstant", "CIPhotoEffectMono", "CIPhotoEffectNoir", "CIPhotoEffectProcess", "CIPhotoEffectTonal", "CIPhotoEffectTransfer", "CISepiaTone", "CIThermal", "CIVignette", "CIVignetteEffect", "CIXRay"]
 kCICategoryTransition: String  轉型:
 [“手風琴折疊過渡”、“條形滑動過渡”、“復印機過渡”、“帶蒙版過渡的瓦解”、“解散過渡”、“Flash過渡”、“Mod過渡”、“頁面卷曲過渡”、“帶陰影過渡的頁面卷曲”、“波紋過渡”、“滑動過渡”]
 ["CIAccordionFoldTransition", "CIBarsSwipeTransition", "CICopyMachineTransition", "CIDisintegrateWithMaskTransition", "CIDissolveTransition", "CIFlashTransition", "CIModTransition", "CIPageCurlTransition", "CIPageCurlWithShadowTransition", "CIRippleTransition", "CISwipeTransition"]
 kCICategoryTileEffect: String  瓷磚的效果
 “仿射鉗”、“仿射瓦”、“鉗”、“八折反射瓦”、“四折反射瓦”、“四折旋轉瓦”、“四折翻譯瓦”、“滑動反射瓦”、“萬花筒”、“Op瓦”、“平行四邊形瓦”、“透視瓦”、“六折反射瓦”、“六折旋轉瓦”、“三角萬花筒”、“三角瓦”、“十二折反射瓦”】
 ["CIAffineClamp", "CIAffineTile", "CIClamp", "CIEightfoldReflectedTile", "CIFourfoldReflectedTile", "CIFourfoldRotatedTile", "CIFourfoldTranslatedTile", "CIGlideReflectedTile", "CIKaleidoscope", "CIOpTile", "CIParallelogramTile", "CIPerspectiveTile", "CISixfoldReflectedTile", "CISixfoldRotatedTile", "CITriangleKaleidoscope", "CITriangleTile", "CITwelvefoldReflectedTile"]
 kCICategoryGenerator: String  各種生成器
 【“帶屬性文本圖像生成器”、“Aztec代碼生成器”、“條碼生成器”、“棋盤生成器”、“128條碼生成器”、“恆色生成器”、“透鏡暈生成器”、“網格生成器”、“PDF417條碼生成器”、“二維碼生成器”、“隨機生成器”、“圓角矩形生成器”、“星光生成器”、“條紋生成器”、“陽光生成器”、“文本圖像生成器”】
 ["CIAttributedTextImageGenerator", "CIAztecCodeGenerator", "CIBarcodeGenerator", "CICheckerboardGenerator", "CICode128BarcodeGenerator", "CIConstantColorGenerator", "CILenticularHaloGenerator", "CIMeshGenerator", "CIPDF417BarcodeGenerator", "CIQRCodeGenerator", "CIRandomGenerator", "CIRoundedRectangleGenerator", "CIStarShineGenerator", "CIStripesGenerator", "CISunbeamsGenerator", "CITextImageGenerator"]
 kCICategoryReduction: String  減少
 【“面積平均”、“面積直方圖”、“面積最大”、“面積最大透明度”、“面積最小透明度”、“面積最小最大”、“面積最小M最大紅色”、“列平均”、“直方圖顯示濾鏡”、“K表示”、“行平均”】
 ["CIAreaAverage", "CIAreaHistogram", "CIAreaMaximum", "CIAreaMaximumAlpha", "CIAreaMinimum", "CIAreaMinimumAlpha", "CIAreaMinMax", "CIAreaMinMaxRed", "CIColumnAverage", "CIHistogramDisplayFilter", "CIKMeans", "CIRowAverage"]
 kCICategoryGradient: String  梯度
 [“高斯梯度”、“色相飽和度值梯度”、“線性梯度”、“徑向梯度”、“平滑線性梯度”]
 ["CIGaussianGradient", "CIHueSaturationValueGradient", "CILinearGradient", "CIRadialGradient", "CISmoothLinearGradient"]
 kCICategoryStylize: String  使風格化
 ["混合與α面具”、“混合與藍色的面具”,“面具”融合,“混合着紅色面具”,“開花”,“喜劇效果”,“卷積3 x3”,“卷積5 x5”、“卷積7 x7”,“卷積9水平”,“卷積9垂直”,“核心毫升模型濾波器”,“結晶”、“景深”、“邊緣”、“邊緣”工作,“伽柏梯度”,“黑暗”,“高度字段從面具”、“六角像素化”、“突出影子調整”,“疊加”,“混合”,“像素化”、“點狀華”、“卓越地圖過濾器”,“最近的樣本”、“陰影材質”、“彩色”、“聚光燈”]
 ["CIBlendWithAlphaMask", "CIBlendWithBlueMask", "CIBlendWithMask", "CIBlendWithRedMask", "CIBloom", "CIComicEffect", "CIConvolution3X3", "CIConvolution5X5", "CIConvolution7X7", "CIConvolution9Horizontal", "CIConvolution9Vertical", "CICoreMLModelFilter", "CICrystallize", "CIDepthOfField", "CIEdges", "CIEdgeWork", "CIGaborGradients", "CIGloom", "CIHeightFieldFromMask", "CIHexagonalPixellate", "CIHighlightShadowAdjust", "CILineOverlay", "CIMix", "CIPixellate", "CIPointillize", "CISaliencyMapFilter", "CISampleNearest", "CIShadedMaterial", "CISpotColor", "CISpotLight"]
 kCICategorySharpen: String  銳化
 ["CISharpenLuminance 銳化亮度", "CIUnsharpMask 銳化掩模"]
 kCICategoryBlur: String  模糊
 [“散焦模糊”、“盒模糊”、“深度模糊效果”、“圓盤模糊”、“高斯模糊”、“蒙面可變模糊”、“中值濾鏡”、“形態梯度”、“形態最大”、“形態最小”、“形態矩形最大”、“形態矩形最小”、“運動模糊”、“降噪”、“變焦模糊”]
 ["CIBokehBlur", "CIBoxBlur", "CIDepthBlurEffect", "CIDiscBlur", "CIGaussianBlur", "CIMaskedVariableBlur", "CIMedianFilter", "CIMorphologyGradient", "CIMorphologyMaximum", "CIMorphologyMinimum", "CIMorphologyRectangleMaximum", "CIMorphologyRectangleMinimum", "CIMotionBlur", "CINoiseReduction", "CIZoomBlur"]
 kCICategoryVideo: String  視頻
 kCICategoryStillImage: String  靜態圖像
 kCICategoryInterlaced: String  國際米蘭的
 kCICategoryNonSquarePixels: String  非方形像素
 kCICategoryHighDynamicRange: String  高動態范圍
 kCICategoryBuiltIn: String  內裝式
 kCICategoryFilterGenerator: String  生成器

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM