SWIFT 3 - CGImage副本总是零

时间:2017-05-08 16:38:04

标签: ios swift swift3 cgimage

遇到此问题并尝试将其修复数小时。

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]所以没有问题。

非常感谢你的时间。

2 个答案:

答案 0 :(得分:2)

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)

(假设您有UIImageVIew名为" symbolImageView")

并且,在保存生成的图像时解决奇怪的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)

    }

}

答案 1 :(得分:0)

我已经更多地研究了这一点,以弄清楚实际上是什么错误。

让我们从这开始:将if-let打破为嵌套的if-let。只是为了弄清楚哪个值返回为零。

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

设置一些断点,逐步告诉我你发现了什么。

______________________________编辑一个______________________________

因此,快速查看docs副本(maskingColorComponents :),似乎组件数组可能存在问题。

<强>组件:

  

一组颜色组件,用于指定用于遮罩图像的颜色或颜色范围。该数组必须包含2N个值{min 1,max 1,... min [N],max [N]},其中N是图像颜色空间中的分量数。组件中的每个值必须是有效的图像样本值。如果图像具有整数像素分量,则每个值必须在[0 .. 2 ** bitsPerComponent - 1]范围内(其中bitsPerComponent是图像的位数/分量)。如果图像具有浮点像素分量,则每个值可以是任何浮点数,它是有效的颜色分量。

您确定您的值对您的图片有效吗?