2010-08-25 12 views
4

Lorsque j'utilise le code suivant:Pourquoi CGImageCreateWithMaskingColors() renvoie-t-il zéro dans ce cas?

UIImage *image=[UIImage imageNamed:@"loginf1.png"]; 
CGImageRef rawImageRef=image.CGImage; 

const float colorMasking[6] = {222, 255, 222, 255, 222, 255}; 

CGImageRef maskedImageRef=CGImageCreateWithMaskingColors(rawImageRef, colorMasking); 

maskedImageRef est toujours nul. Pourquoi est-ce, et que puis-je faire pour corriger cela?

Répondre

4

J'ai eu le même problème. Le CGImageRef que vous créez n'a que 6 octets pour chaque pixel avec octet sans canal alpha. La fonction de masquage a besoin d'un CGImageRef avec 8 octets pour chaque pixel, seulement 6 d'entre eux sont utilisés, sans canal alpha. Au moins, je pense c'est ce qui le cause. Quoi qu'il en soit, corrigez-le en créant un contexte bitmap, en dessinant votre image dans ce contexte bitmap, puis en obtenant votre CGImageRef de CGBitmapContextCreateImage.

+0

Je peux ajouter un point de données à cette interprétation. CGImageCreateWithMaskingColors semble ne pas aimer créer des images masquées à partir d'images avec un canal alpha actif. Ce qui est assez logique: Quand vous êtes à Rome - ou du moins, lorsque vous utilisez des images (telles que PNG) avec des canaux alpha, utilisez le canal alpha intégré pour le masquage. –

+0

Pouvez-vous poster un échantillon de code? – Dejell

0

La raison de l'échec est que vous ne pouvez pas créer une image de masque avec un canal alpha. Malheureusement, ce que vous essayez n'est pas possible. La seule façon d'utiliser "CGImageCreateWithMaskingColors (...)" est de lui fournir un contexte bitmap SANS canal alpha. Le catch 22 ici est qu'il n'est pas possible de créer un contexte bitmap SANS un canal alpha. N'aimes-tu pas juste Apple?

+0

Comment savez-vous que son image est une chaîne alpha? – Dejell

+4

Voici un contexte bitmap sans canal alpha: 'CGBitmapContextCreate (nil, W, H, 8, W, CGColorSpaceCreateDeviceGray(), CGBitmapInfo (CGImageAlphaInfo.None.toRaw()))' – mxcl

+0

Ou vous pouvez utiliser 'UIGraphicsBeginImageContextWithOptions (size, true , 0) '(c'est-à-dire une valeur' true' pour l'option 'opaque'). – Rob