2011-11-29 17 views
9

Come posso eliminare la parte magenta di un UIImage e renderlo trasparente?Colore iOS a trasparente in UIImage

Ho esaminato numerose risposte e collegamenti su SO e niente funziona (ad esempio How to make one color transparent on a UIImage? risposta 1 rimuove tutto tranne il rosso, la risposta 2 a quanto pare non funziona a causa di Why is CGImageCreateWithMaskingColors() returning nil in this case?).

Aggiornamento:

Se uso CGImageCreateWithMaskingColors con l'UIImage ottengo un valore nullo. Se rimuovo il canale alfa (rappresento l'immagine come JPEG e la rileggo) CGImageCreateWithMaskingColors restituisce un'immagine dipinta con uno sfondo nero.

Update2, il codice:

Tornando nil:

const float colorMasking[6] = {222, 255, 222, 255, 222, 255}; 
CGImageRef imageRef = CGImageCreateWithMaskingColors(anchorWithMask.CGImage, colorMasking); 

NSLog(@"image ref %@", imageRef); 
// this is going to return a nil imgref. 

UIImage *image = [UIImage imageWithCGImage:imageRef]; 

Tornando un'immagine con sfondo nero (che è normale poiché non c'è canale alfa):

UIImage *inputImage = [UIImage imageWithData:UIImageJPEGRepresentation(anchorWithMask, 1.0)]; 

const float colorMasking[6] = {222, 255, 222, 255, 222, 255}; 
CGImageRef imageRef = CGImageCreateWithMaskingColors(inputImage.CGImage, colorMasking); 

NSLog(@"image ref %@", imageRef); 
// imgref is NOT nil. 

UIImage *image = [UIImage imageWithCGImage:imageRef]; 

Aggiornamento3:

Ho funzionato aggiungendo il canale alfa dopo il processo di mascheratura.

+2

Pubblica il tuo codice. –

+2

Aggiunto il codice. –

risposta

4
UIImage *image = [UIImage imageNamed:@"image.png"]; 

const float colorMasking[6] = {1.0, 1.0, 0.0, 0.0, 1.0, 1.0}; 
image = [UIImage imageWithCGImage: CGImageCreateWithMaskingColors(image.CGImage, colorMasking)]; 

Si riceve nil, perché i parametri inviati non sono validi. Se si apre la documentazione di Apple, si vedrà questo:

Componenti
Una serie di componenti di colore che specificano un colore o una gamma di colori per mascherare l'immagine con. La matrice deve contenere 2N valori {min [1], max [1], ... min [N], max [N]} dove N è il numero di componenti nello spazio colore dell'immagine. Ogni valore nei componenti deve essere un valore di esempio di immagine valido . Se l'immagine ha componenti di pixel interi, allora ogni valore deve essere compreso nell'intervallo [0 .. 2 ** bitsPerComponent - 1] (dove bitsPerComponent è il numero di bit/componente dell'immagine). Se l'immagine ha componenti in virgola mobile, allora ogni valore può essere qualsiasi numero in virgola mobile che è un componente di colore valido.

È possibile aprire rapidamente la documentazione tenendo premuto Opzione + Mouse Fare clic su alcune funzioni o classi, come CGImageCreateWithMaskingColors.

+0

Ho appena provato questo e restituisce un uiimage completamente trasparente. –

+0

Ecco come appare l'immagine di input: http://i.imgur.com/lxJdm.png (questa è la versione png, internamente è un UIImage di UIImagePicker) –

4

ho fatto questa funzione statica che rimuove lo sfondo bianco si può utilizzare sostituendo la maschera con la gamma di colori che si desidera rimuovere:

+ (UIImage*) processImage :(UIImage*) image 
{ 
    const float colorMasking[6]={222,255,222,255,222,255}; 
    CGImageRef imageRef = CGImageCreateWithMaskingColors(image.CGImage, colorMasking); 
    UIImage* imageB = [UIImage imageWithCGImage:imageRef]; 
    CGImageRelease(imageRef); 
    return imageB; 
} 
+1

Ho votato questo prima di testarlo, non lo fa lavoro. –

+0

Sta funzionando sul mio progetto e sto rimuovendo la gamma di colori bianca.Penso che specifichi che i colori variano come in questo che uso da 222 a 255 per il rosso da rimuovere. Potrei non capirlo al 100% ma potresti provare di nuovo con l'intervallo di cui hai bisogno. –

+0

@khaledannajar Ho usato questo codice è un lavoro perfetto ma ancora qualche pixcel bianco non può rimuovere dal bordo della linea vuota che ho disegnato in modo programmatico nella mia app – kb920

Problemi correlati