web-dev-qa-db-fra.com

Utilisation de Graphics.DrawImage () pour dessiner une image avec transparence / canal alpha

Je copie une image. (Mon code réel redimensionne l'image, mais ce n'est pas pertinent pour ma question.) Mon code ressemble à ceci.

Image src = ...

using (Image dest = new Bitmap(width, height))
{
    Graphics graph = Graphics.FromImage(dest);
    graph.InterpolationMode = InterpolationMode.HighQualityBicubic;
    graph.DrawImage(src, 0, 0, width, height);
    dest.Save(filename, saveFormat);
}

Cela semble très bien fonctionner à moins que src soit chargé à partir d'une image avec des transparents (comme GIF) ou un canal alpha (comme PNG).

Comment puis-je obtenir DrawImage() pour transférer les transparents/canal alpha vers la nouvelle image, puis les conserver lorsque j'enregistre le fichier?

17
Jonathan Wood

Ce n'est pas clair, il y a beaucoup de choses que vous n'avez pas dites. Le plus gros problème avec la transparence est que vous ne pouvez pas le voir. Vous avez sauté quelques étapes, vous n'avez pas spécifié explicitement le format de pixel de votre nouveau bitmap, vous ne l'avez pas du tout initialisé et vous n'avez pas dit quel format de sortie vous utilisez. Certains ne soutiennent pas la transparence. Faisons donc une version qui la rend limpide. À partir d'une image PNG qui ressemble à ceci dans Paint.net:

enter image description here

Utiliser ce code

        using (var src = new Bitmap("c:/temp/trans.png"))
        using (var bmp = new Bitmap(100, 100, PixelFormat.Format32bppPArgb)) 
        using (var gr = Graphics.FromImage(bmp)) {
            gr.Clear(Color.Blue);
            gr.DrawImage(src, new Rectangle(0, 0, bmp.Width, bmp.Height));
            bmp.Save("c:/temp/result.png", ImageFormat.Png);
        }

Produit cette image:

enter image description here

Vous pouvez clairement voir le fond bleu pour que la transparence fonctionne.

28
Hans Passant

J'ai trouvé ce fil parce que j'avais le même problème (c'est-à-dire que DrawImage n'a pas copié le canal alpha), mais dans mon cas, c'est simplement parce que j'ai oublié que j'ai utilisé PixelFormat.Format32bppRgb au lieu de PixelFormat.Format32bppArgb. Donc à peu près ce que Lukasz M a dit dans les commentaires.

0
Alex