如何使System.Drawing.Image半透明?

时间:2010-02-04 15:50:16

标签: .net image graphics transparency alpha

System.Drawing.Graphics.DrawImage将一张图片贴在另一张图片上。但我找不到透明度选项。

我已经在图像中绘制了我想要的所有内容,我只想让它变成半透明(alpha-transparency)

3 个答案:

答案 0 :(得分:14)

没有“透明度”选项,因为您尝试做的事情称为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 :(得分: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;
}

答案 2 :(得分:-1)

我复制了Mitch链接的答案,前提是我认为这对我有用:

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