2010-02-04 96 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; 
}