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?
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:
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:
Vous pouvez clairement voir le fond bleu pour que la transparence fonctionne.
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.