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是图像的位数/分量数)的范围内。 如果图像具有浮点像素分量,则每个值可以是任何作为有效颜色分量的浮点数。
你确定你的价值观对你的形象有效吗?