2011-05-05 11 views
8

Usando CoreGraphics (dentro de mi método drawRect), estoy tratando de aplicar un modo de fusión a una imagen (png transparente), y luego ajusto el alfa del resultado. Asumo que esto debe hacerse en dos pasos, pero podría estar equivocado. Esto es lo que tengo hasta ahora (que funciona bien):iOS: procesamiento de imágenes de 2 pasos con CoreGraphics

CGContextRef context = UIGraphicsGetCurrentContext(); 

CGContextSaveGState(context); 

//SET COLOR - EDIT... added a more practical color example 
CGContextSetRGBFillColor(context, 0.0, 1.0, 0.0, 1); 

//flips drawing context (apparently this is necessary) 
CGContextTranslateCTM(context, 0.0, self.bounds.size.height); 
CGContextScaleCTM(context, 1.0, -1.0);//flip context 

//DRAW PIN IMAGE 
UIImage *pin = [UIImage imageNamed:@"pin"]; 
CGRect pinrect = CGRectMake(12, 17, 25, 25);  
CGContextDrawImage(context, pinrect, pin.CGImage);//draws image in context 

//Apply blend mode 
CGContextSetBlendMode(context, kCGBlendModeColor); 
CGContextClipToMask(context, pinrect, pin.CGImage); // restricts drawing to within alpha channel 

//fills context with mask, applying blend mode 
CGContextFillRect(context, pinrect); 

CGContextRestoreGState(context); 

// -- Do something here to make result 50% transparent ?? -- 

Asumo que necesito para sacar todo esto en una especie de contexto por separado en algún lugar, llamar CGContextSetAlpha(...), y luego volver a llamar de nuevo a mi contexto original, pero no estoy seguro de cómo. Configurar el alfa antes de mi CGContextFillRect final solo cambiará la cantidad que se aplicó el modo de fusión, no el alfa de la imagen completa.

EDIT: captura de pantalla publicado

enter image description here

Gracias de antemano.

+1

¿Qué sucede si llama a CGContextSetAlpha antes de dibujar la imagen? Es posible que también desee restablecerlo a 1 después de dibujar la imagen, pero antes de aplicar la mezcla. – ughoavgfhw

+0

Gracias, pero lamentablemente se atenúa tanto la imagen como la cantidad en que se aplica el modo de fusión. es decir. Será 50% transparente y 50% cambiará a verde. Lo quiero 100% cambiado a verde y luego 50% transparente. – Chazbot

+0

Todavía no entiendo cómo debería ser el resultado, ¿pueden proporcionarme algunas imágenes, por favor? –

Respuesta

9

Usando capas de transparencia, puede aplicar la mezcla a una imagen dibujada al 100% y mostrar el resultado al 50%. El resultado se ve así:
Image showing output Usé el fondo texturizado para que pueda ver claramente que la imagen inferior es 50% transparente para todo, en lugar de solo la otra imagen, como fue el caso en mi intento anterior. Aquí está el código:

CGContextRef context = UIGraphicsGetCurrentContext(); 

CGContextTranslateCTM(context, 0.0, self.bounds.size.height); 
CGContextScaleCTM(context, 1.0, -1.0);//flip context 

CGRect fullImageRect = (CGRect){42,57,100,100}; 
CGRect transparentImageRect = (CGRect){12,17,100,100}; 
CGContextSetRGBFillColor(context, 0.0, 1.0, 0.0, 1); 

// Draw image at 100% 
UIImage *testImage = [UIImage imageNamed:@"TestImage"]; 
CGContextDrawImage(context,fullImageRect,testImage.CGImage); 

// Set 50% transparency and begin a transparency layer. Inside the transparency layer, the alpha is automatically reset to 1.0 
CGContextSetAlpha(context,0.5); 
CGContextBeginTransparencyLayer(context, NULL); 
// Draw the image. It is viewed at 100% within the transparency layer and 50% outside the transparency layer. 
CGContextDrawImage(context, transparentImageRect, testImage.CGImage); 
// Draw blend on top of image 
CGContextClipToMask(context, transparentImageRect, testImage.CGImage); 
CGContextSetBlendMode(context, kCGBlendModeColor); 
CGContextFillRect(context, transparentImageRect); 
// Exit transparency layer, causing the image and blend to be composited at 50%. 
CGContextEndTransparencyLayer(context); 

Editar: Se eliminó el contenido antiguo porque ocupaba mucho espacio y no era útil. Mire en el historial de revisiones si quiere verlo.

+0

Gracias un montón por tirar esto juntos. En el ejemplo anterior, estás en lo correcto; la imagen inferior se dibuja con la imagen al 50% y la mezcla al 100%, pero parece que solo tiene un 50% de transparencia _al círculo rosa + azul_. En otras palabras, el 50% del fondo gris no se muestra a través de la imagen inferior, que es lo que necesito. El círculo superior hace esto, pero su cambio de color no es del 100%. Perdón por ser un fanático de los detalles, y gracias de nuevo por su ayuda. – Chazbot

+0

OK, ahora entiendo lo que quiere, y descubrí cómo hacerlo. Necesita usar capas de transparencia. Voy a modificar mi publicación para mostrar esto. – ughoavgfhw

+0

Increíble. ¡gracias! – Chazbot

Cuestiones relacionadas