1

我有一个 PictureBox,在上面绘制来自文件的图像,一个在另一个之上(如果你熟悉的话,就像一个 Photoshop 分层概念)。作为 PNG 并且具有不透明度索引,这些图像是图像合成的完美候选者。但我不知道如何做到这一点并保存到文件中。

在下面的代码示例中,我将两个 PNG 图像加载到位图对象中,并将它们绘制在 PictureBox 上。

private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
    Rectangle DesRec = new Rectangle(0, 0, pictureBox1.Width, pictureBox1.Height);
    Bitmap bmp;
    Rectangle SrcRec;

    bmp = (Bitmap)Image.FromFile(Application.StartupPath + "\\Res\\base.png");
    SrcRec = new Rectangle(0, 0, bmp.Width, bmp.Height);

    e.Graphics.DrawImage(bmp, DesRec, SrcRec, GraphicsUnit.Pixel);

    bmp = (Bitmap)Image.FromFile(Application.StartupPath + "\\Res\\layer1.png");
    SrcRec = new Rectangle(0, 0, bmp.Width, bmp.Height);

    e.Graphics.DrawImage(bmp, DesRec, SrcRec, GraphicsUnit.Pixel);
}

如何将合成保存到一个文件,最好是另一个 PNG 文件?

4

2 回答 2

3

我会开始绘制一个中间的内存位图,然后我会保存它(如果真的需要,最终会在你的图片框中绘制)。像这样的东西:

var bmp = new Bitmap(pictureBox1.Width, pictureBox1.Height);

using (var graphics = Graphics.FromImage(bmp))
{
    // ...
    graphics.DrawImage(...);
    // ...
}

bmp.Save("c:\\test.png", ImageFormat.Png);
于 2013-03-20T13:50:23.457 回答
1

谢谢你们俩。我决定按照 Efran Cobisi 的建议去做,并更改了程序,以便它首先在内存中进行创作。然后我可以随心所欲地使用它。

我反映更改的新代码如下 -

// Image objects to act as layers (which will hold the images to be composed)
Image Layer0 = new Bitmap(Application.StartupPath + "\\Res\\base.png");
Image Layer1 = new Bitmap(Application.StartupPath + "\\Res\\layer1.png");

//Creating the Canvas to draw on (I'll be saving/using this)
Image Canvas = new Bitmap(222, 225);

//Frame to define the dimentions
Rectangle Frame = new Rectangle(0, 0, 222, 225);

//To do drawing and stuffs
Graphics Artist = Graphics.FromImage(Canvas);

//Draw the layers on Canvas
Artist.DrawImage(Layer0, Frame, Frame, GraphicsUnit.Pixel);
Artist.DrawImage(Layer1, Frame, Frame, GraphicsUnit.Pixel);

//Free up resources when required
Artist.dispose();

//Show the Canvas in a PictureBox
pictureBox1.Image = Canvas;

//Save the Canvas image
Canvas.Save("MYIMG.PNG", ImageFormat.Png);

显然,图像 ( Canvas) 保存的不透明度指数完好无损。

于 2013-03-20T15:45:59.963 回答