2010-02-04 11 views
8

System.Drawing.Graphics.DrawImage colle une image sur une autre. Mais je ne pouvais pas trouver une option de transparence.Comment faire un System.Drawing.Image semi-transparent?

Je l'ai déjà tiré tout ce que je veux dans l'image, je veux seulement le rendre translucide (transparence alpha)

+1

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

+0

@Mitch blé - cette question est spécifique aux GIF – Oded

+0

Les GIF n'ont pas de semi-transparence. Je parle de PNG ici –

Répondre

11

Il n'y a pas d'option "transparence" car ce que vous essayez de faire s'appelle 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

j'ai copié une réponse à partir du lien Mitch à condition que je pense va travailler pour moi:

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

cela n'a pas fonctionné, car le Bitmap.Pallete.Entries est vide –

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; 
}