2012-05-18 17 views
9

Estoy copiando una imagen. (Mi código real está cambiando el tamaño de la imagen, pero eso no es relevante para mi pregunta.) Mi código se ve más o menos así.Usando Graphics.DrawImage() para dibujar una imagen con transparencia/Alpha Channel

Image src = ... 

using (Image dest = new Bitmap(width, height)) 
{ 
    Graphics graph = Graphics.FromImage(dest); 
    graph.InterpolationMode = InterpolationMode.HighQualityBicubic; 
    graph.DrawImage(src, 0, 0, width, height); 
    dest.Save(filename, saveFormat); 
} 

Esto parece funcionar gran a menos src se carga desde una imagen con transparencias (como GIF) o un canal alfa (como PNG).

¿Cómo puedo obtener DrawImage() para transferir las transparencias/canal alfa a la nueva imagen, y luego guardarlas cuando guardo el archivo?

+0

La pregunta es ¿cuál es el valor de la variable 'saveFormat'? Debería ser 'PixelFormat.Format32bppArgb' (u otro formato con canal alfa manejado). Pruebe también: 'using (Image dest = new Bitmap (width, height, PixelFormat.Format32bppArgb))'. –

+0

Esto parece funcionar para canales alfa, pero no para transparencias GIF. 'saveFormat' variará según el formato del archivo de entrada. Si el archivo de entrada no admite el canal alfa, entonces es seguro asumir que la imagen no contendrá píxeles del canal alfa. –

+0

Entonces, ¿cuál es el valor de 'saveFormat' para archivos GIF, entonces :)? –

Respuesta

22

No está muy claro, hay muchas cosas que no dijiste. El mayor problema con la transparencia es que no puedes verlo. Se saltó un par de pasos, no especificó explícitamente el formato de píxel de su nuevo mapa de bits, no lo inicializó en absoluto y no dijo qué formato de salida utilizó. Algunos no son compatibles con la transparencia. Entonces, hagamos una versión que lo aclare. una imagen PNG que tiene este aspecto en paint.net de:

enter image description here

Utilizando este código

 using (var src = new Bitmap("c:/temp/trans.png")) 
     using (var bmp = new Bitmap(100, 100, PixelFormat.Format32bppPArgb)) 
     using (var gr = Graphics.FromImage(bmp)) { 
      gr.Clear(Color.Blue); 
      gr.DrawImage(src, new Rectangle(0, 0, bmp.Width, bmp.Height)); 
      bmp.Save("c:/temp/result.png", ImageFormat.Png); 
     } 

producen este imagen:

enter image description here

Usted puede ver claramente la fondo azul por lo que la transparencia funcionó.

+1

Bueno, mi intención era apoyar cualquier formato que coincidiera con el archivo de entrada. Pensé que era bastante específico. Es solo que el código no fue diseñado para admitir solo un tipo de archivo. Tal vez necesito un montón de código para manejar cada tipo de archivo, no lo sé. Intenté especificar el PixelFormat como lo hizo, pero luego parecía que estaba causando errores cuando el tipo de archivo era GIF con transparencia. Y, de hecho, algunas variaciones parecían funcionar bien con PNG sin especificar el PixelFormat. –

+0

@JonathanWood crea un nuevo mapa de bits con el ancho y alto del mapa de bits anterior, y el nuevo formato que desees. Preferiblemente en una instrucción 'using', crea un objeto Graphics' FromImage ('tu nuevo mapa de bits')' y 'DrawImage (' tu viejo mapa de bits') '. –

Cuestiones relacionadas