[英]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.