2010-10-03 6 views
5

he enmascarado mi imagen así:CGImageCreateWithMask funciona bien pero el área enmascarada es negra en la imagen resultante, ¿cómo puedo configurarla para que sea blanca?

CGImageRef maskRef = [[UIImage imageNamed:@"testMask2.png"] CGImage]; 

CGImageRef mask = CGImageMaskCreate(CGImageGetWidth(maskRef), 
            CGImageGetHeight(maskRef), 
            CGImageGetBitsPerComponent(maskRef), 
            CGImageGetBitsPerPixel(maskRef), 
            CGImageGetBytesPerRow(maskRef), 
            CGImageGetDataProvider(maskRef), nil, YES); 

UIImage *image = [UIImage imageWithContentsOfFile:path]; 

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

imageView.image = [UIImage imageWithCGImage:masked]; 

y funciona muy bien, pero la imagen resultante tiene NEGRO donde fue enmascarada, ¿cómo puedo configurarlo para que tenga BLANCO donde su enmascarado?

Respuesta

9

Si está ocultando una imagen JPEG que no tiene canal alfa, sucederá esto (fondo negro en lugar de transparente).

Así que hay que hacer algo como esto antes del enmascaramiento:

CGImageRef imageNoAlpha = [UIImage imageNamed:@"noAlphaImage.jpg"].CGImage; 

CGColorSpaceRef cs = CGColorSpaceCreateDeviceRGB(); 

CGFloat width = CGImageGetWidth(imageNoAlpha); 
CGFloat height = CGImageGetHeight(imageNoAlpha); 

CGContextRef ctxWithAlpha = CGBitmapContextCreate(nil, width, height, 8, 4*width, cs, kCGImageAlphaPremultipliedFirst); 

CGContextDrawImage(ctxWithAlpha, CGRectMake(0, 0, width, height), imageNoAlpha); 

CGImageRef imageWithAlpha = CGBitmapContextCreateImage(ctxWithAlpha); 

CGImageRef masked = CGImageCreateWithMask(imageWithAlpha, mask); 

...

Asegúrese de liberar las imágenes creadas, contexto y espacio de color ...

+1

Hay un pequeño error ortográfico para la altura, está obteniendo el ancho en su lugar –

+0

Gracias @BahriOkuroglu ... corregido. –

0

Se supone que la imagen es transparente donde está "enmascarada"; el color que ve dependerá de en qué fondo lo dibuje.

(No recuerdo si hay un requisito de que la imagen de origen tiene un canal alfa.)

puede valer la pena asegurarse de que imageView.opaque = NO.

+0

Configuré el alfa del fondo imageView en 0 y opaco en NO, pero aún así me pongo negro, me pregunto si la negrura está en el nivel CGImage, como si tuviera que dibujarla en un contexto. – Shizam

+0

Shizam: la "negrura" es lo que está debajo de la vista de la imagen. o si es transparente, lo que sea que esté debajo de eso. ¡son tortugas hasta abajo! – rpetrich

+0

Nah, como prueba, creé PNG con transparencia y lo puse en ese imageView y se mostró a través del color de fondo (azul), pero si pongo la imagen enmascarada resultante ahí sigue siendo negro. Pasé por una operación más larga para crear un bitmapContext y dibujar la imagen en él y LUEGO usar el contexto resultante como la fuente de una imagen, que tenía un punteo alfa correcto a través de ella. Extraño. – Shizam

0

Prueba esto:

imageView.opaque = NO; 
imageView.backgroundColor = [UIColor clearColor];

Además, la imagen utilizada para enmascarar deben ser en blanco y negro (no transparente).

0

he tenido problemas con el mismo problema La solución es bastante simple: Es el mejor para crear contexto gráfico para enmascarar esta manera:

UIGraphicsBeginImageContextWithOptions(maskFrame.size, NO, 0.0); 
CGContextRef ctx = UIGraphicsGetCurrentContext(); 
CGRect ff = CGRectMake(0, 0, maskFrame.size.width, mask.size.height); 
CGContextClipToMask(ctx, ff, mask.CGImage); 
.... 

Asegúrese de que, el segundo parámetro en UIGraphicsBeginImageContextWithOptions se establece en NO (lo que significa contexto ninguno-opaco) Otra ventaja es que esta función de creación escala automáticamente el contexto a las pantallas retina.

Cuestiones relacionadas