2013-10-03 79 views
1

我有這個代碼拋出異常「pictureBox2.Image.Save(st +」patch1.jpg「);」我認爲沒有什麼保存在pictureBox2.Image上,但我已經創建了圖形g。 如何保存pictureBox2.Image的圖像?保存從圖片框中的圖像,圖像是由圖形對象繪製

 Bitmap sourceBitmap = new Bitmap(pictureBox1.Image, pictureBox1.Width, pictureBox1.Height); 
     Graphics g = pictureBox2.CreateGraphics(); 
     g.DrawImage(sourceBitmap, new Rectangle(0, 0, pictureBox2.Width, pictureBox2.Height),rectCropArea, GraphicsUnit.Pixel); 
     sourceBitmap.Dispose(); 
     g.Dispose(); 
     path = Directory.GetCurrentDirectory(); 
     //MessageBox.Show(path); 
     string st = path + "/Debug"; 
     MessageBox.Show(st); 
     pictureBox2.Image.Save(st + "patch1.jpg"); 

回答

2

有幾個問題。

首先,CreateGraphics是一個臨時繪圖曲面,不適合保存任何東西。我懷疑你要真正創建一個新的形象,並在第二個PictureBox中顯示出來:

Bitmap newBitmap = new Bitmap(pictureBox1.Width, pictureBox1.Height); 
using (Graphics g = Graphics.FromImage(newBitmap)) { 
    g.DrawImage(pictureBox1.Image, new Rectangle(0, 0, pictureBox2.Width, pictureBox2.Height), rectCropArea, GraphicsUnit.Pixel); 
} 
pictureBox2.Image = newBitmap; 

其次,使用Path.Combine函數來創建文件的字符串:

string file = Path.Combine(new string[] { Directory.GetCurrentDirectory(), "Debug", "patch1.jpg" }); 
newBitmap.Save(file, ImageFormat.Jpeg); 

這條道路有存在,否則Save方法將拋出一個GDI +異常。

+1

我可能會在OP後3年,但感謝您給我一個需要幾個小時才能找到的答案。 – James

1

Graphics g = pictureBox2.CreateGraphics();

你應該閱讀了關於這個方法您呼叫的文檔,它不是在所有你想要的。這是爲了在OnPaint之外進行控制,這是一種不好的做法,會被下一個OnPaint覆蓋,並且與PictureBox.Image屬性無關,完全沒有任何影響。

你究竟在做什麼?您想要保存在PictureBox控件中顯示的圖像的裁剪嗎?在將其保存到磁盤之前,是否需要預覽裁剪操作?裁剪矩形更改時是否需要更新此預覽?提供更多的細節。

1

這樣做是相反的。爲該位圖創建一個目標位圖和一個Graphics實例。然後將源圖片框圖像複製到該位圖中。最後,將該位圖分配給第二個圖片框

Rectangle rectCropArea = new Rectangle(0, 0, 100, 100); 
Bitmap destBitmap = new Bitmap(pictureBox2.Width, pictureBox2.Height); 
Graphics g = Graphics.FromImage(destBitmap); 
g.DrawImage(pictureBox1.Image, new Rectangle(0, 0, pictureBox2.Width, pictureBox2.Height), rectCropArea, GraphicsUnit.Pixel); 
g.Dispose(); 
pictureBox2.Image = destBitmap; 
pictureBox2.Image.Save(@"c:\temp\patch1.jpg");