2010-05-05 12 views
12

Estoy trabajando en una aplicación que puede cambiar los bordes o un UIImage rectangular. Los bordes variarán, pero parecerá que el UIImage fue cortado con tijeras, o algo que afecta.enmascarando un UIImage

¿Cuál es la mejor manera de hacerlo?

Mi primer pensamiento es preparar un montón de PNG transparentes con el efecto de borde correcto que estoy buscando, y de alguna manera usar eso como una máscara para mi UIImage. ¿Es este el camino correcto? ¿O hay una forma programática más flexible para hacer esto?

Respuesta

24

Éstos son el núcleo de gráficos llama que se puede utilizar para enmascarar la imagen:

//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

¡GRACIAS! Me he estado preguntando cómo hacer esto. Para la posteridad, hay un pequeño error ortográfico en su primera asignación de UIImage: debería decir 'imageNamed' como lo hace su segunda. – dooleyo

+0

Necesario para actualizar 'imageWithCGImage:' a 'imageWIthCGImage: scale: orientation:' – jowie

+0

Muy similar a http://stackoverflow.com/a/5757417 – danh

3

Sí, eso es más o menos lo que necesita hacer. El mejor enfoque es usar Core Graphics; la guía de programación en 2D de Quartz tiene un article describing how to mask images with other images. Puede obtener un CGImageRef (que utilizan estos métodos de gráficos centrales) de un objeto UIImage a través de su propiedad CGImage, y luego obtener un UIImage desde su CGImageRef modificado (enmascarado) utilizando el método de clase UIImage+imageWithCGImage:.

+1

CGImage de un UIImage es nulo si se creó a partir de un CIImage así que tenga cuidado. – Aggressor

6

Usted necesita enmascaramiento de imagen para que, escribí una tutorial on how to use it y cómo lo he usado en mi propia aplicación.

El siguiente código de ejemplo debería ayudarlo a comenzar, necesita la imagen original y una imagen de máscara como entrada y devuelve la imagen enmascarada como salida.

- (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

He estado revisando esto, y desafortunadamente no puedo hacerlo funcionar . Puse la imagen en el primer parámetro, que la imagen en blanco y negro en el segundo, ambas del mismo tamaño, y la salida es exactamente la misma que la primera imagen. – jowie

+0

Su enlace de tutorial está roto. – capikaw