Рисование прозрачных изображений - PullRequest
0 голосов
/ 27 ноября 2009

Я пишу движок спрайтов CSS на C #, но у меня есть несколько проблем. Я создаю мастер-изображение, устанавливаю все свойства, затем повторяю sprites и рисую их в мастер-образе. Однако, когда я прихожу, чтобы сохранить главное изображение, оно кажется только пустым основным изображением с прозрачным фоном и ни одним из sprites. Я очень смущен тем, где я иду не так.

Код, который я использую:

    // 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 {

    }

Ответы [ 2 ]

0 голосов
/ 27 ноября 2009

Что такое sprite.Left и Top? Если они не равны 0, это может быть проблемой. Я думаю, что вы имеете исток и источник неверный?

http://msdn.microsoft.com/en-us/library/ms142045.aspx

Попробуйте более простой вариант DrawImage, если вы еще этого не сделали. например DrawImage(sprite.Sprite,0,0)

0 голосов
/ 27 ноября 2009

Вы рисуете в "графику", но затем вы сохраняете "растровое изображение"? Я не уверен, что эта графика внутренне работает с вашим оригинальным растровым объектом ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...