簡體   English   中英

SWIFT 3 - CGImage副本總是零

[英]SWIFT 3 - CGImage copy always nil

有這個問題,並試圖修復它幾個小時。

func changeColorByTransparent(colorMasking : [CGFloat]) {

    UIGraphicsBeginImageContext(self.symbolImageView.frame.size)
    self.symbolImageView.layer.render(in: UIGraphicsGetCurrentContext()!)
    self.symbolImageView.image = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    if let image = self.symbolImageView.image {
        print("image ok")
        if let cgimage = image.cgImage {
            print("cgimage ok")
            if let imageRef = cgimage.copy(maskingColorComponents: colorMasking) {
                print("imageRef ok")
                self.symbolImageView.image = UIImage(cgImage: imageRef, scale: (self.symbolImageView.image?.scale)!, orientation: (self.symbolImageView.image?.imageOrientation)!)
            }
        }
    }
}

控制台給我:

image ok
cgimage ok

它總是告訴我imageRef是nil但調試找到symbolImageView.image的圖像,這個圖像是JPG。 colorMasking就像colorMasking = [222,255,222,255,222,255]所以沒有問題。

非常感謝您的寶貴時間。

copy(maskingColorComponents components: [CGFloat])copy(maskingColorComponents components: [CGFloat]) 不能有alpha組件。 使用UIGraphicsGetImageFromCurrentImageContext獲取圖像的方式會產生alpha分量。

嘗試這個:

func changeColorByTransparent(imgView: UIImageView, cMask: [CGFloat]) -> UIImage? {

    var returnImage: UIImage?

    if let capImage = imgView.image {

        let sz = capImage.size

        UIGraphicsBeginImageContextWithOptions(sz, true, 0.0)
        capImage.draw(in: CGRect(origin: CGPoint.zero, size: sz))
        let noAlphaImage = UIGraphicsGetImageFromCurrentImageContext()
        UIGraphicsEndImageContext()

        let noAlphaCGRef = noAlphaImage?.cgImage

        if let imgRefCopy = noAlphaCGRef?.copy(maskingColorComponents: cMask) {

            returnImage = UIImage(cgImage: imgRefCopy)

        }

    }

    return returnImage

}

並稱之為:

var cMask : [CGFloat] = []

cMask = [222, 255, 222, 255, 222, 255]

let newImage = changeColorByTransparent(imgView: symbolImageView, cMask: cMask)

(假設您有一個名為“symbolImageView”的UIImageVIew

並且,在保存生成的圖像時繞過奇怪的alpha通道問題:

func saveImageWithAlpha(theImage: UIImage, destFile: URL) -> Void {

    // odd but works... solution to image not saving with proper alpha channel
    UIGraphicsBeginImageContext(theImage.size)
    theImage.draw(at: CGPoint.zero)
    let saveImage = UIGraphicsGetImageFromCurrentImageContext()
    UIGraphicsEndImageContext()

    if let img = saveImage, let data = UIImagePNGRepresentation(img) {

        try? data.write(to: destFile)

    }

}

我會更多地研究這個,以找出實際上是錯的。

讓我們從這開始:將if-let打破為嵌套的if-let。 只是為了弄清楚哪個值返回零。

if let image = self.symbolImageView.image? {
   if let cgImage = image.cgImage {
      ...
   }
}

設置一些斷點,一步一步讓我知道你發現了什么。

______________________________EDIT ONE______________________________

因此,快速查看復制文檔 (maskingColorComponents :),似乎組件數組可能存在問題。

組件:

一組顏色組件,指定用於遮罩圖像的顏色或顏色范圍。 該數組必須包含2N個值{min 1 ,max 1 ,... min [N],max [N]},其中N是圖像顏色空間中的分量數。 組件中的每個值必須是有效的圖像樣本值。 如果圖像具有整數像素分量,則每個值必須在[0 .. 2 ** bitsPerComponent - 1]范圍內(其中bitsPerComponent是圖像的位數/分量)。 如果圖像具有浮點像素分量,則每個值可以是作為有效顏色分量的任何浮點數。

您確定您的價值對您的形象有效嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM