Dessiner des images transparentes
-
05-07-2019 - |
Question
J'écris un moteur de sprite CSS en C #, mais je rencontre quelques problèmes. Je crée l'image principale, définit toutes les propriétés sur celle-ci, puis itère les sprites
et les dessine sur l'image principale. Cependant, lorsque je viens d'enregistrer l'image principale, celle-ci ne semble être que l'image principale vide avec un fond transparent et aucun des sprites
. Je suis très confus au point où je me trompe.
Le code que j'utilise est le suivant:
// Work out the width/height required
int max_width = 0;
int max_height = 0;
foreach(SpriteInformation sprite in sprites) {
if (max_width < (sprite.Left + greatest_width)) max_width = sprite.Left + greatest_width;
if (max_height < (sprite.Top + greatest_height)) max_height = sprite.Top + greatest_height;
}
// Create new master bitmap
Bitmap bitmap = new Bitmap(max_width,max_height,PixelFormat.Format32bppArgb);
Graphics graphics = Graphics.FromImage(bitmap);
// Set background color
SolidBrush brush;
if (cbxBackground.Checked) {
if (txtColor.Text == "") {
brush = new SolidBrush(Color.Black);
} else {
brush = new SolidBrush(pnlColor.BackColor);
}
} else {
if (txtColor.Text == "") {
brush = new SolidBrush(Color.White);
} else {
brush = new SolidBrush(pnlColor.BackColor);
}
}
//graphics.FillRectangle(brush,0,0,bitmap.Width,bitmap.Height);
bitmap.MakeTransparent(brush.Color);
graphics.Clear(brush.Color);
// Copy images into place
ImageAttributes attr = new ImageAttributes();
//attr.SetColorKey(brush.Color,brush.Color);
foreach(SpriteInformation sprite in sprites) {
Rectangle source = new Rectangle(0,0,sprite.Width,sprite.Height);
Rectangle dest = new Rectangle(sprite.Left,sprite.Top,sprite.Width,sprite.Height);
graphics.DrawImage(sprite.Sprite,dest,0,0,sprite.Width,sprite.Height,GraphicsUnit.Pixel,attr);
}
// Save image
string format = ddlFormat.Items[ddlFormat.SelectedIndex].ToString();
if (format == "PNG") {
dlgSave.Filter = "PNG Images|*.png|All Files|*.*";
dlgSave.DefaultExt = ",png";
if (dlgSave.ShowDialog() == DialogResult.OK) {
bitmap.Save(dlgSave.FileName,ImageFormat.Png);
}
} else if (format == "JPEG") {
} else {
}
La solution
Que sont sprite.Left et Top? S'ils ne sont pas 0, cela peut poser problème. Je pense que vous avez choisi la source et l’inverse?
http://msdn.microsoft.com/en-us/library /ms142045.aspx
Essayez une variante DrawImage plus simple si ce n’est déjà fait.
par exemple. DrawImage (sprite.Sprite, 0,0)
Autres conseils
Vous dessinez dans "graphiques", puis vous enregistrez "bitmap"? Je ne suis pas sûr que ces graphiques fonctionnent en interne avec votre "bitmap" d'origine. objet ...