SWIFT 3 – 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是零,但debuggingfindsymbolImageView.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 { ... } } 

设置一些中断点,通过并让我知道你find了什么。

______________________________EDIT ONE______________________________

所以快速看一下copy(maskingColorComponents :)的文档 ,好像组件数组可能有问题。

组件:

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

你确定你的价值观对你的形象有效吗?