我的Windows窗体应用程序上有PictureBox
。
我在其中加载了一张图片,并在代码中启用了Paint
事件。它绘制一个矩形。
像这样:
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
Graphics gr = e.Graphics;
Pen p = new Pen(Color.Red);
p.Width = 5.0f;
gr.DrawRectangle(p, 1, 2, 30, 40);
}
然后点击“保存”按钮:
private void button2_Click(object sender, EventArgs e)
{
pictureBox1.Image.Save(@"C:\Documents and Settings\tr1g3800\Desktop\WALKING\30P\100000test.jpg",ImageFormat.Jpeg);
}
但保存的文件从不包含我绘制的矩形。
有没有人有任何想法?
答案 0 :(得分:6)
谢谢。你的答案都有帮助。 这工作
private void button1_Click(object sender, EventArgs e)
{
pictureBox1.ImageLocation=@"C:\Documents and Settings\tr1g3800\Desktop\WALKING\30P\100000.jpg" ;
}
private void button2_Click(object sender, EventArgs e)
{
pictureBox1.Image.Save(@"C:\Documents and Settings\tr1g3800\Desktop\WALKING\30P\100000test.jpg",ImageFormat.Jpeg);
}
private void pictureBox1_Paint(object sender, PaintEventArgs e)
{
}
private void button3_Click(object sender, EventArgs e)
{
Bitmap bmp = new Bitmap(pictureBox1.Image);
Graphics gr = Graphics.FromImage(bmp);
Pen p = new Pen(Color.Red);
p.Width = 5.0f;
gr.DrawRectangle(p, 1, 2, 30, 40);
pictureBox1.Image = bmp;
}
答案 1 :(得分:5)
答案 2 :(得分:3)
以下是我的解决方案,其中包含对各种文件类型的额外支持:
public void ExportToBmp(string path)
{
using(var bitmap = new Bitmap(pictureBox.Width, pictureBox.Height))
{
pictureBox.DrawToBitmap(bitmap, pictureBox.ClientRectangle);
ImageFormat imageFormat = null;
var extension = Path.GetExtension(path);
switch (extension)
{
case ".bmp":
imageFormat = ImageFormat.Bmp;
break;
case ".png":
imageFormat = ImageFormat.Png;
break;
case ".jpeg":
case ".jpg":
imageFormat = ImageFormat.Jpeg;
break;
case ".gif":
imageFormat = ImageFormat.Gif;
break;
default:
throw new NotSupportedException("File extension is not supported");
}
bitmap.Save(path, imageFormat);
}
}
答案 3 :(得分:3)
这是一个小例子,为我澄清了一些事情(我也在努力解决这个问题)。
pBox是Form1上的PictureBox,使其至少为50x50
appPath派生自System.Reflection,但使用您喜欢的任何路径
有两个按钮,一个用于绘图,一个用于保存,它们的点击事件在下面的代码中。
我学到的东西:
(1)“pBox.Image =”除了初始化pBox图像之外什么都不做,它不一定是文件名就像我发现的每个例子一样(因为它是共享锁定而有问题保存到同一个文件)。此外,如果您的目标是在整个控件的表面上查看内容,您可能希望将初始化时的大小设置为所需的大小。我在这个例子中使用了pBox的大小,但通常我使用位图大小(因为我通常以真实的图片文件开头)。
(2)我总是遇到问题,要么看到我的绘图出现在控件上,要么看到我的更改保存在输出文件中(或两者都有)。在我之前的尝试中,我会在控件和位图上复制绘制。当然这不是必需的,但编辑后的位图需要重新加载到control.image中...而这就是我想念的这个难题。
(A)从control.image创建一个位图并在位图上绘制
(B)将位图加载到control.Image中(这样你就可以看到绘制引起的变化)
(C)保存control.Image
(2-option)你有一个全局(或传递)位图(可能来自真实文件)
(A)在位图上绘制
(B)将位图加载到control.Image中(以便您可以看到更改)
(C)保存位图
public Form1()
{
InitializeComponent();
pBox.Image = new Bitmap(pBox.Width, pBox.Height);
}
private void DrawStuff1_Click(object sender, EventArgs e)
{
Bitmap bmp = new Bitmap(pBox.Image);
Graphics g = Graphics.FromImage(bmp);
g.FillRectangle(Brushes.Red, 5, 5, 25, 25); //hard-coded size to reduce clutter
pBox.Image = bmp; //this makes your changes visible
}
private void Save_Click(object sender, EventArgs e)
{
pBox.Image.Save(appPath + "SavedImage.bmp");
}
答案 4 :(得分:1)
您需要绘制图片的图像,而不是Paint事件上的Graphics控件。
修改强>
using( Graphics g = Graphics.FromImage( pictureBox1.Image ) ) {
// there you will be do, what you do in Paint event
}
// ... somewhere else ...
pictureBox1.Save( _required_parameters_ );