2009-06-30 32 views
9

我的Windows Forms应用程序上有一个PictureBox如何将picturebox控件另存为jpeg文件编辑后

我加载了一张图片,并在代码中启用了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); 
} 

但保存的文件从来不包含我绘制的矩形。

有没有人有任何想法?

回答

5

你可能不应该直接对图片框绘制。

您需要改为使用位图。尝试将位图放在PictureBox.Image中,然后调用Save()。

检查this更多细节

1

您需要绘制图片的图像,而不是Paint事件的图形控件。

编辑:

using(Graphics g = Graphics.FromImage(pictureBox1.Image)) { 
    // there you will be do, what you do in Paint event 
} 

// ... somewhere else ... 
pictureBox1.Save(_required_parameters_); 
+2

嗨 你能澄清/举个例子? – tguclu 2009-06-30 13:00:18

5

Thanks.Your anwers所有帮助。 这个工作

 private void button1_Click(object sender, EventArgs e) 
    { 
     [email protected]"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; 
    } 
+2

您赞成使用“使用(...){...}”模式。现在,你可以有一些内存泄漏。 如果一些答案解决了你的答案,你应该接受它;)。 – TcKs 2009-06-30 14:00:27

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

这里是澄清一些事情,我一个小例子(我用这个挣扎了一下太)。

PBOX是Form1上放置一个图片框,使其至少50×

APPPATH从衍生的System.Reflection而是用你喜欢

任何路径有两个按钮,一个用于绘图,一个用于保存,他们的点击事件在下面的代码中。

事情我了解到:

(1)“pBox.Image =”没有做任何事情,但初始化PBOX图像,它并没有成为一个文件名作为每一个例子,我发现使用(保存有问题到同一个文件,因为它被共享锁定)。另外,如果您的目标是在整个控件的表面上看到事物,您可能会希望在初始化时将大小设置为所需的大小。我在这个例子中使用了pBox的大小,但通常我使用位图大小(因为我通常从一个真实的图片文件开始)。 (2)我总是遇到问题,要么看到我的绘图显示在控件上,要么看到我的更改保存在输出文件(或两者)中。在我之前的尝试中,我会在控件和位图上重复绘制。当然,这并不是必须的,但编辑过的位图需要重新加载到control.image中,这是我错过的这个难题。

(A)从control.image创建位图和画上了位图

(B)加载位图到control.Image(所以你可以看到造成平局的变化)

(C)保存control.Image

(2选项)你有一个全球性的(或通过)位图(可能是从一个真实的文件)

(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"); 
    }