2010-02-04 78 views
8

System.Drawing.Graphics.DrawImage將一個圖像粘貼到另一個圖像上。但我找不到透明度選項。如何製作一個System.Drawing.Image半透明?

我已經得出我想要的一切的形象,我只是想使它半透明(alpha透明度)

+1

http://stackoverflow.com/questions/189392/how-do-you-draw-transparent-image-using-system-drawing – 2010-02-04 15:54:16

+0

@米奇小麥 - 這個問題特定於GIF – Oded 2010-02-04 15:56:01

+0

GIF沒有半透明度。我在這裏討論PNG – 2010-02-04 15:58:17

回答

11

沒有「透明度」選項,因爲您試圖做的是稱爲Alpha混合。

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 2014-01-28 10:27:33

-1

我複製從米奇提供的鏈接,我覺得會爲我工作的答案:

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

它沒有工作,因爲Bitmap.Pallete.Entries是空的 – 2010-02-04 16:26:26

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