2017-05-08 3 views
0

avoir ce problème et essayer de le réparer pendant des heures.SWIFT 3 - Copie CGImage toujours

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)!) 
      } 
     } 
    } 
} 

La console me donne:

image ok 
cgimage ok 

Il me dit toujours que imageRef est nul mais le debug trouver une image pour symbolImageView.image et cette image est en JPG. Le colorMasking est comme colorMasking = [222,255,222,255,222,255] donc pas de problème non plus.

Merci beaucoup pour votre temps.

+0

"Le colorMasking est comme colorMasking = [222,255,222,255,222,255]" C'est le problème. Ces valeurs sont fausses. – matt

Répondre

2

La source pour copy(maskingColorComponents components: [CGFloat])ne peut pas avoir un composant alpha. La façon dont vous obtenez une image avec UIGraphicsGetImageFromCurrentImageContext donne un composant alpha.

Essayez ceci:

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 

} 

et l'appeler comme ceci:

var cMask : [CGFloat] = [] 

cMask = [222, 255, 222, 255, 222, 255] 

let newImage = changeColorByTransparent(imgView: symbolImageView, cMask: cMask) 

(en supposant que vous avez un UIImageVIew nommé "symbolImageView")

et, pour se déplacer d'une alpha étrange problème de canal lors de l'enregistrement de l'image résultante:

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) 

    } 

} 
+0

Ty c'est le problème. Le problème n'était pas le masque de couleur merci. –

+0

Si vous êtes familier avec CGImage, pouvez-vous me dire le résultat d'une telle fonction parce que sur l'écran le résultat semble être une image avec transparence (nous avons coupé la couleur pour que nous voyions l'arrière-plan UIViewController. la galerie iPhone ce résultat comme à PNG avec UIImagePNGRepresentation il semble avoir un fond noir Ty –

+0

@Florian_L - voir la modification dans ma réponse – DonMag

0

Je voudrais regarder dans celui-ci un peu plus pour comprendre ce qui ne va pas. Commençons par ceci: cassez votre if-let dans un if-let imbriqué. Juste pour comprendre quelle valeur revient nulle.

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

Définissez quelques points d'arrêt, passez à travers et faites-moi savoir ce que vous trouvez.

______________________________EDIT ONE______________________________

prenant donc un coup d'œil à la docs pour la copie (maskingColorComponents :) il semble que il pourrait y avoir un problème avec l'ensemble des composants.

Composants:

Un ensemble de composantes de couleur qui spécifient une couleur ou une gamme de couleurs pour masquer l'image à l'aide. Le tableau doit contenir 2N valeurs {min 1, max 1, ... min [N], max [N]} où N est le nombre de composants dans l'espace colorimétrique de l'image. Chaque valeur dans les composants doit être une valeur d'échantillon d'image valide. Si l'image a des composantes de pixels entières, alors chaque valeur doit être dans la plage [0 .. 2 ** bitsPerComponent - 1] (où bitsPerComponent est le nombre de bits/composant de l'image). Si l'image a des composantes de pixels à virgule flottante, alors chaque valeur peut être n'importe quel nombre à virgule flottante qui est un composant de couleur valide.

Etes-vous certain que vos valeurs sont valables pour votre image?

+0

J'ai modifié la question. Ty pour votre aide. –