如何保存在 PictureBox 上创建的图形?
How to save graphics created on a PictureBox?
在 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();
}
除非您知道自己在做什么,否则不应使用方法 PictureBox.CreateGraphics()
,因为它可能会导致一些不太明显的问题。例如,在您的场景中,当您最小化或调整 window 的大小时,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
.
从不 使用control.CreateGraphics
! 在控件的 Paint
事件中使用 Graphics g = Graphics.FromImage(bmp)
或 绘制到 Bitmap bmp
中,使用e.Graphics
参数..
这是一个裁剪代码,它绘制到一个新的位图中并利用了您的控件等,但改变了一些东西:
- 它使用从新
Bitmap
创建的 Graphics
对象
- 它使用
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);
}
替代方法是..:[=24=]
- 将您所有的代码移动到
Paint
事件
- 将
Graphics g = pictureBox3.CreateGraphics();
替换为 Graphics g = e.Graphics;
- 将这两行插入点击事件:
Bitmap targetBitmap = new Bitmap(pictureBox3.ClientSize.Width,
pictureBox3.ClientSize.Height);
pictureBox3.DrawToBitmap(targetBitmap, pictureBox3.ClientRectangle);
在 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();
}
除非您知道自己在做什么,否则不应使用方法 PictureBox.CreateGraphics()
,因为它可能会导致一些不太明显的问题。例如,在您的场景中,当您最小化或调整 window 的大小时,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
.
从不 使用control.CreateGraphics
! 在控件的 Paint
事件中使用 Graphics g = Graphics.FromImage(bmp)
或 绘制到 Bitmap bmp
中,使用e.Graphics
参数..
这是一个裁剪代码,它绘制到一个新的位图中并利用了您的控件等,但改变了一些东西:
- 它使用从新
Bitmap
创建的 - 它使用
using
子句来确保它不会泄漏 - 它采用
pictureBox3.ClientSize
的大小,因此不包含任何边框..
Graphics
对象
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);
}
替代方法是..:[=24=]
- 将您所有的代码移动到
Paint
事件 - 将
Graphics g = pictureBox3.CreateGraphics();
替换为Graphics g = e.Graphics;
- 将这两行插入点击事件:
Bitmap targetBitmap = new Bitmap(pictureBox3.ClientSize.Width,
pictureBox3.ClientSize.Height);
pictureBox3.DrawToBitmap(targetBitmap, pictureBox3.ClientRectangle);