2010-02-04 9 views
8

System.Drawing.Graphics.DrawImage pega una imagen en otra. Pero no pude encontrar una opción de transparencia.Cómo hacer un System.Drawing.Image semitransparente?

ya he dibujado todo lo que quiero en la imagen, sólo quiero que sea translúcida (alfa-transparencia)

+1

http://stackoverflow.com/questions/189392/how-do-you-draw-transparent-image-using-system-drawing –

+0

@Mitch Trigo - esa pregunta es específico de los GIF – Oded

+0

Los GIF no tienen semitransparencia. Estoy hablando de PNG aquí –

Respuesta

11

No hay opción de "transparencia" porque lo que está intentando hacer se llama Alpha Blending.

public static class BitmapExtensions 
{ 
    public static Image SetOpacity(this Image image, float opacity) 
    { 
     var colorMatrix = new ColorMatrix(); 
     colorMatrix.Matrix33 = opacity; 
     var imageAttributes = new ImageAttributes(); 
     imageAttributes.SetColorMatrix(
      colorMatrix, 
      ColorMatrixFlag.Default, 
      ColorAdjustType.Bitmap); 
     var output = new Bitmap(image.Width, image.Height); 
     using (var gfx = Graphics.FromImage(output)) 
     { 
      gfx.SmoothingMode = SmoothingMode.AntiAlias; 
      gfx.DrawImage(
       image, 
       new Rectangle(0, 0, image.Width, image.Height), 
       0, 
       0, 
       image.Width, 
       image.Height, 
       GraphicsUnit.Pixel, 
       imageAttributes); 
     } 
     return output; 
    } 
} 

Alpha Blending

+1

[ColorMatrix] (http://msdn.microsoft.com/en-us/library/system.drawing.imaging.colormatrix (v = vs.110)) .aspx) + [ImageAttributes] (http://msdn.microsoft.com/en-us/library/system.drawing.imaging.imageattributes (v = vs.110) .aspx) + [SmoothingMode] (http://msdn.microsoft.com/en-us/library/z714w2y9(v=vs.110).aspx) – Bitterblue

-1

que copiar una respuesta desde el enlace Mitch siempre que creo que va a trabajar para mí:

public static Bitmap SetOpacity(this Bitmap bitmap, int alpha) 
{ 
    var output = new Bitmap(bitmap.Width, bitmap.Height); 
    foreach (var i in Enumerable.Range(0, output.Palette.Entries.Length)) 
    { 
     var color = output.Palette.Entries[i]; 
     output.Palette.Entries[i] = 
      Color.FromArgb(alpha, color.R, color.G, color.B); 
    } 
    BitmapData src = bitmap.LockBits(
     new Rectangle(0, 0, bitmap.Width, bitmap.Height), 
     ImageLockMode.ReadOnly, 
     bitmap.PixelFormat); 
    BitmapData dst = output.LockBits(
     new Rectangle(0, 0, bitmap.Width, bitmap.Height), 
     ImageLockMode.WriteOnly, 
     output.PixelFormat); 
    bitmap.UnlockBits(src); 
    output.UnlockBits(dst); 
    return output; 
} 
+1

no funcionó, ya que Bitmap.Pallete.Entries está vacío –

2
private Image GetTransparentImage(Image image, int alpha) 
{ 
    Bitmap output = new Bitmap(image); 

    for (int x = 0; x < output.Width; x++) 
    { 
     for (int y = 0; y < output.Height; y++) 
     { 
      Color color = output.GetPixel(x, y); 
      output.SetPixel(x, y, Color.FromArgb(alpha, color.R, color.G, color.B)); 
     } 
    } 

    return output; 
} 
Cuestiones relacionadas