Swift之CIImage、CGImage、UIImage之間的相互轉換

Swift之CIImage、CGImage、UIImage之間的相互轉換

iOS開發中對於Image的對象有三種形式CIImage、CGImage、UIImage,有時候我們通常需要三者之間進行轉換,下面簡單介紹一下:

CIImage轉UIImage

/// CIImage轉UIImage相對簡單,直接使用UIImage的初始化方法即可
    func convertCIImageToUIImage(ciImage:CIImage) -> UIImage {
        let uiImage = UIImage.init(ciImage: ciImage)
        // 注意!!!這裏的uiImage的uiImage.cgImage 是nil
        let cgImage = uiImage.cgImage
        // 注意!!!上面的cgImage是nil,原因如下,官方解釋
        // returns underlying CGImageRef or nil if CIImage based
        return uiImage
    }

CGImage轉UIImage

// CGImage轉UIImage相對簡單,直接使用UIImage的初始化方法即可
// 原理同上
    func convertCIImageToUIImage(cgImage:CGImage) -> UIImage {
        let uiImage = UIImage.init(cgImage: cgImage)
        // 注意!!!這裏的uiImage的uiImage.ciImage 是nil
        let ciImage = uiImage.ciImage
        // 注意!!!上面的ciImage是nil,原因如下,官方解釋
        // returns underlying CIImage or nil if CGImageRef based
        return uiImage
    }

CGImage與CIImage互相轉換

    // MARK:- convert the CGImageToCIImage
    /// convertCGImageToCIImage
    ///
    /// - Parameter cgImage: input cgImage
    /// - Returns: output CIImage
    func convertCGImageToCIImage(cgImage:CGImage) -> CIImage{
        return CIImage.init(cgImage: cgImage)
    }

    // MARK:- convert the CIImageToCGImage
    /// convertCIImageToCGImage
    ///
    /// - Parameter ciImage: input ciImage
    /// - Returns: output CGImage
    func convertCIImageToCGImage(ciImage:CIImage) -> CGImage{


        let ciContext = CIContext.init()
        let cgImage:CGImage = ciContext.createCGImage(ciImage, from: ciImage.extent)!
        return cgImage
    }

UIImage轉爲CGImage、CIImage

/// UIImage轉爲CIImage
/// UIImage轉CIImage有時候不能直接採用uiImage.ciImage獲取
/// 當uiImage.ciImage爲nil的時候需要先通過uiImage.cgImage得到
/// cgImage, 然後通過convertCGImageToCIImage將cgImage裝換爲ciImage
    func convertUIImageToCIImage(uiImage:UIImage) -> CIImage {

        var ciImage = uiImage.ciImage
        if ciImage == nil {
            let cgImage = uiImage.cgImage
            ciImage = self.convertCGImageToCIImage(cgImage: cgImage!)
        }
        return ciImage!
    }
/// UIImage轉爲CGImage
/// UIImage轉CGImage有時候不能直接採用uiImage.cgImage獲取
/// 當uiImage.cgImage爲nil的時候需要先通過uiImage.ciImage得到
/// ciImage, 然後通過convertCIImageToCGImage將ciImage裝換爲cgImage
    func convertUIImageToCGImage(uiImage:UIImage) -> CGImage {
        var cgImage = uiImage.cgImage

        if cgImage == nil {
            let ciImage = uiImage.ciImage
            cgImage = self.convertCIImageToCGImage(ciImage: ciImage!)
        }
        return cgImage!
    }

// 通過UIImage.init(named: "image.png") 得到的uiImage
// 默認是通過CGImageRef得到的因此uiImage的uiImage.ciImage爲nil
let uiImage = UIImage.init(named: "image.png")
// cgImage有值
let cgImage = uiImage.cgImage 
// ciImage爲nil
let ciImage = uiImage.ciImage

UIImage轉Data

// 只有當uiImage.cgImage有值的時候纔可以使用UIImagePNGRepresentation(_ image: UIImage)
// 或者UIImageJPEGRepresentation(_ image: UIImage, _ compressionQuality: CGFloat)轉換爲Data
    func convertUIImageToData(uiImage:UIImage) -> Data {
        var data = UIImagePNGRepresentation(uiImage)
        if data == nil {
            let cgImage = self.convertUIImageToCGImage(uiImage: uiImage)
            let uiImage_ = UIImage.init(cgImage: cgImage)
            data = UIImagePNGRepresentation(uiImage_)
        }
        return data!
    }

以上均代碼爲Swift3.0,均經過測試,如有問題請聯繫我QQ437482772

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