2010-05-05 17 views
12

Sto lavorando a un'app che può modificare i bordi o un UIImage rettangolare. I bordi varieranno, ma sembrerà che l'UIImage sia stato tagliato con le forbici, o qualcosa di simile.masking a UIImage

Qual è il modo migliore per farlo?

Il mio primo pensiero è preparare un gruppo di PNG trasparenti con l'effetto bordo corretto che sto cercando, e quindi usarlo in qualche modo come maschera per il mio UIImage. È questa la strada giusta? O c'è un modo programmatico più flessibile per farlo?

risposta

24

Ecco il Graphics Core chiama che è possibile utilizzare per mascherare l'immagine:

//Mask Image 
UIImage *inputImage = [UIImage imageNamed:@"inputImage.png"]; 
CGImageRef maskRef = [UIImage imageNamed:@"mask.png"].CGImage; 

CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), 
            CGImageGetHeight(maskRef), 
            CGImageGetBitsPerComponent(maskRef), 
            CGImageGetBitsPerPixel(maskRef), 
            CGImageGetBytesPerRow(maskRef), 
            CGImageGetDataProvider(maskRef), NULL, false); 

CGImageRef masked = CGImageCreateWithMask([inputImage CGImage], mask); 
CGImageRelease(mask); 

UIImage *maskedImage = [UIImage imageWithCGImage:masked]; 

CGImageRelease(masked); 
+0

GRAZIE! Ti stai chiedendo come fare questo. Ai posteri, c'è un piccolo errore di battitura nel tuo primo alloc UIImage: dovrebbe dire 'imageNamed' come la vostra seconda lo fa. – dooleyo

+0

necessario per aggiornare 'imageWithCGImage:' a 'imageWIthCGImage: Scala: Orientamento:' – jowie

+0

Molto simile a http://stackoverflow.com/a/5757417 – danh

3

Sì, è più o meno quello che devi fare. L'approccio migliore è utilizzare la grafica principale; la guida alla programmazione 2D di Quartz ha un article describing how to mask images with other images. È possibile ottenere un CGImageRef (che utilizzano questi metodi di grafica core) da un oggetto UIImage tramite la proprietà CGImage e quindi ottenere uno modificato con il metodo modificato utilizzando il metodo di classe UIImage+imageWithCGImage:.

+1

CGImage da un UIImage è nullo se è stato creato da un CIImage quindi state attenti. – Aggressor

6

È necessario mascheramento immagine per questo, ho scritto un tutorial on how to use it e come ho usato nella mia propria applicazione.

Il seguente codice di esempio dovrebbe aiutarti a iniziare, ha bisogno dell'immagine originale e di un'immagine maschera come input e restituisce l'immagine mascherata come output.

- (UIImage*) maskImage:(UIImage *) image withMask:(UIImage *) mask 
{ 
    CGImageRef imageReference = image.CGImage; 
    CGImageRef maskReference = mask.CGImage; 

    CGImageRef imageMask = CGImageMaskCreate(CGImageGetWidth(maskReference), 
              CGImageGetHeight(maskReference), 
              CGImageGetBitsPerComponent(maskReference), 
              CGImageGetBitsPerPixel(maskReference), 
              CGImageGetBytesPerRow(maskReference), 
              CGImageGetDataProvider(maskReference), 
              NULL, // Decode is null 
              YES // Should interpolate 
              ); 

    CGImageRef maskedReference = CGImageCreateWithMask(imageReference, imageMask); 
    CGImageRelease(imageMask); 

    UIImage *maskedImage = [UIImage imageWithCGImage:maskedReference]; 
    CGImageRelease(maskedReference); 

    return maskedImage; 
} 
+0

Ho cercato su questo, e purtroppo non riesco proprio a farlo funzionare . Ho messo l'immagine nel primo parametro, immagine B & W rispetto al secondo, sia la stessa dimensione, e l'uscita è esattamente la stessa della prima immagine. – jowie

+0

Il tuo link tutorial è rotto. – capikaw