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