Question

System.Drawing.Graphics.DrawImage colle une image sur une autre. Mais je ne pouvais pas trouver une option de transparence.

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

Était-ce utile?

La solution

Il n'y a pas d'option « transparence » parce que ce que vous essayez de faire est appelé 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

Autres conseils

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

Je copiais une réponse 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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top