2011-05-06 10 views
15

Quiero implementar un degradado alfa en una imagen. Desde 0.5 alfa en la parte superior de la imagen hasta 0.0 en la parte inferior. Cualquier consejo, tutorial, enlace es bienvenido.¿Cómo implementar un degradado alfa en una imagen?

+0

¿desea modificar la imagen original o solo le preocupa que se muestre con un degradado? – nielsbot

+0

Solo quiero mostrar un degradado debajo de la imagen. –

+0

Anomie ha cubierto este caso en su respuesta – nielsbot

Respuesta

25

Puede utilizar CGImageCreateWithMask a aplicar una imagen de enmascaramiento a la misma. Puede generar una máscara adecuada simplemente dibujando en una escala de grises o en un CGBitmapContext solo alfa con CGContextDrawLinearGradient.

Si se muestra como el contenido de un CALayer, puede aplicar una capa de enmascaramiento apropiada a la propiedad mask de la capa primaria. Puede usar CAGradientLayer con los colores apropiados para crear esta máscara.

Puede dibujar la imagen en un CGBitmapContext, y luego dibujar un degradado alfa apropiado sobre él usando kCGBlendModeDestinationIn. O dibuja primero el degradado y dibuja la imagen sobre él usando kCGBlendModeSourceIn. En ambos casos, CGContextDrawLinearGradient es nuevamente tu amigo. Luego, por supuesto, obtenga la imagen del CGContext usando CGBitmapContextCreateImage o CGImageCreate en el buffer de datos subyacente.

O, por supuesto, si controla la imagen original y nunca necesita una versión sin el degradado alfa, podría simplemente almacenarla como un PNG con los valores alfa apropiados en primer lugar.

+0

excelente respuesta gracias! – James

2

Cree una nueva imagen leyendo los píxeles en la imagen existente (obteniendo su RGBA) línea por línea agregándolos a la nueva imagen con los mismos valores RGB pero ajustando los valores alfa por línea.

Algunas otras de las preguntas que debe darle todo lo necesario para que:

How to get pixel data from a UIImage (Cocoa Touch) or CGImage (Core Graphics)?

Can I edit the pixels of the UIImage's property CGImage

+2

Si bien esto funcionará, probablemente sea mucho más lento que usar Core Graphics. No olvide que también tendrá que ajustar los valores RGB si está utilizando alpha premultiplicado. – Anomie

6

Usted puede intentar CAGradientLayer.

UIView *view = [[[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)] autorelease]; 
CAGradientLayer *gradient = [CAGradientLayer layer]; 
gradient.frame = view.bounds; 
gradient.colors = [NSArray arrayWithObjects:(id)[[UIColor blackColor] CGColor], (id)[[UIColor whiteColor] CGColor], nil]; 
[view.layer insertSublayer:gradient atIndex:0]; 

Otra opción

Prueba la respuesta sugerida por @Caleb en esta anterior SO question

Usted puede ir para Graphics Contexts. Todo el dibujo ocurre en un contexto de gráficos . Si desea crear una imagen que tiene un degradado radial, o un gradiente lineal , o cualquier otra cosa, Tendrá que:

  • Crear un contexto gráfico para su imagen con
    UIGraphicsBeginImageContextWithOptions.
  • Haga el dibujo que desee que aparezca en la imagen.
  • Llame UIGraphicsGetImageFromCurrentImageContext para obtener la imagen del contexto.
    Esto le da un UIImage, por lo que no es necesario para convertir a partir de CGImage.
  • Llame al UIGraphicsEndImageContext para limpiar el contexto.

También puede echar un vistazo a Radial gradient on UImage

1

Encontré algo here, ¡funciona genial!

AlphaGradientView* gradient = [[AlphaGradientView alloc] initWithFrame: 
          CGRectMake(self.view.frame.size.width - 150, 0, 150, 
               self.view.frame.size.height)]; 

gradient.color = [UIColor yellowColor]; 
gradient.direction = GRADIENT_RIGHT; 
[self.view addSubview:gradient]; 
Cuestiones relacionadas