如何保存在PictureBox上创建的图形?

问题描述 投票:0回答:2

在 c# 和 Visual Studio Windows 窗体中,我已将图像加载到图片框 (pictureBox2) 中,然后裁剪它并显示在另一个图片框 (pictureBox3) 中。

现在我想将 pictureBox3 中的内容保存为图像文件。

我该怎么做?

private void crop_bttn_Click(object sender, EventArgs e)
{
    Image crop = GetCopyImage("grayScale.jpg");
    pictureBox2.Image = crop;

    Bitmap sourceBitmap = new Bitmap(pictureBox2.Image, 
                                     pictureBox2.Width, pictureBox2.Height);
    Graphics g = pictureBox3.CreateGraphics();

    g.DrawImage(sourceBitmap, new Rectangle(0, 0, 
                pictureBox3.Width, pictureBox3.Height), rectCropArea, GraphicsUnit.Pixel);
    sourceBitmap.Dispose();
}
c# winforms graphics crop picturebox
2个回答
2
投票

永远不要使用

control.CreateGraphics
Either 使用
Bitmap bmp
在控件的 Graphics g = Graphics.FromImage(bmp) 事件中使用
Paint
参数绘制到
e.Graphics
中..

这是一个裁剪代码,它绘制成新的位图并利用您的控件等,但更改了一些内容:

  • 它使用从新的
    Graphics
     创建的 
    Bitmap
  • 对象
  • 它利用
    using
    条款来确保它不会泄漏
  • 它采用
    pictureBox3.ClientSize
    的大小,因此它不会包含任何边框..

private void crop_bttn_Click(object sender, EventArgs e)
{
    Image crop = GetCopyImage("grayScale.jpg");
    pictureBox2.Image = crop;
    Bitmap targetBitmap = new Bitmap(pictureBox3.ClientSize.Width, 
                                    pictureBox3.ClientSize.Height);
    using (Bitmap sourceBitmap = new Bitmap(pictureBox2.Image, 
                 pictureBox2.ClientSize.Width, pictureBox2.ClientSize.Height))
    {
        using (Graphics g = Graphics.FromImage(targetBitmap))
        {
            g.DrawImage(sourceBitmap, new Rectangle(0, 0, 
                        pictureBox3.ClientSize.Width, pictureBox3.ClientSize.Height), 
                        rectCropArea, GraphicsUnit.Pixel);
        }
    }
    if (pictureBox3.Image != null) pictureBox3.Image.Dispose();
    pictureBox3.Image = targetBitmap;
    targetBitmap.Save(somename, someFormat);
}

替代方案是..:

  • 所有代码移动到
    Paint
    事件
  • Graphics g = pictureBox3.CreateGraphics();
    替换为
    Graphics g = e.Graphics;
  • 将这两行插入到点击事件中:

Bitmap targetBitmap = new Bitmap(pictureBox3.ClientSize.Width, 
                                pictureBox3.ClientSize.Height);
pictureBox3.DrawToBitmap(targetBitmap, pictureBox3.ClientRectangle);

有关 CreateGraphics 的更多信息及其正确用法,请参阅此处


1
投票

除非您知道自己在做什么,否则不应使用

PictureBox.CreateGraphics()
方法,因为它可能会导致一些不那么明显的问题。例如,在您的场景中,当您最小化或调整窗口大小时,
pictureBox3
中的图像将会消失。

更好的方法是绘制位图,您也可以保存它:

var croppedImage = new Bitmap(pictureBox3.Width, pictureBox3.Height);
var g = Graphics.FromImage(croppedImage);
g.DrawImage(crop, new Point(0, 0), rectCropArea, GraphicsUnit.Pixel);
g.Dispose();
//Now you can save the bitmap
croppedImage.Save(...);
pictureBox3.Image = croppedImage;

顺便说一句,请使用更合理的变量名称,尤其是

pictureBox1..3

© www.soinside.com 2019 - 2024. All rights reserved.