0
我正在開發一個圖像合併項目(Image Combine)第一個前景圖像位於背景圖像的(0,0)位置。該位置正在通過使用數字上傳控件進行更改。代碼如下ExternalException「在GDI +中發生了一般性錯誤。」
private void nudXPositions_ValueChanged(object sender, EventArgs e)
{
{
lock (typeof(FrmImageMerge))
{
nudXPositions.Maximum = imgBackWidth;
if (pbMergeImagePreview.Image != null)
pbMergeImagePreview.Image.Dispose();
pbMergeImagePreview.InitialImage = null;
posX = decimal.ToInt16(nudXPositions.Value);
posY = decimal.ToInt16(nudYPosition.Value);
MergeImages(tbxBackImage.Text, tbxForeImage.Text);
lblMergeImagePreview.Text = "";
pbBackgroundImagePreview.Refresh();
try
{
Thread.Sleep(100);
Image image1 = Image.FromFile(tempName);
this.pbMergeImagePreview.Image = image1;
pbBackgroundImagePreview.Refresh();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
btnSaveImageAs.Enabled = true;
}
}
}
然後調用MergeImage()方法。該方法低於
private void MergeImages(string ImageBack,string ImageFore)
{
pbMergeImagePreview.Image = null;
pbMergeImagePreview.Refresh();
// try
//{
backExtension = Path.GetExtension(tbxBackImage.Text);
System.Drawing.Graphics myGraphic = null;
Image imgB;
imgB = Image.FromFile(ImageBack);
Image imgF;
imgF = Image.FromFile(ImageFore);
Image m;
m = Image.FromFile(ImageBack);
myGraphic = System.Drawing.Graphics.FromImage(m);
myGraphic.DrawImageUnscaled(imgB,0,0);
myGraphic.DrawImageUnscaled(imgF,posX,posY);
myGraphic.Save();
getMyDocument = Environment.GetFolderPath(Environment.SpecialFolder.Personal);
tempName = string.Format("{0}{1}{2}{3}{4}{5}",getMyDocument,"\\","Merge Image","\\","Imageback",backExtension);
if (File.Exists(tempName))
{
File.Delete(tempName);
}
m.Save(tempName);
imgB.Dispose();
imgF.Dispose();
m.Dispose();
myGraphic.Dispose();
//}
//catch (Exception ex)
// {
// MessageBox.Show(ex.Message);
//}
}
當程序執行時和更改位置時,foreimage根據位置而改變。這是保存到臨時圖像。然後,如果我們再次改變位置,則重新創建臨時圖像,並替換爲舊圖像。但是當我做這個程序一段時間時,會有一個例外; 「發生了ExternalExcetion」。這也是「GDI +中發生的一般錯誤」。我嘗試了很多和搜索瀏覽器。我無法解決我的問題。謝謝
我可以建議在最後使用()而不是所有的配置嗎?它可能會使它更清晰一些,並確保您正確地解決所有問題。你的應用程序的內存使用情況如何,就像你使用過這種方法的內存一樣? – Ian
你是什麼意思使用()?是可以用來代替dispose()的方法嗎? 關於內存使用情況:在開始時,內存使用量爲6mb,發生異常時爲18mb。 – Lakshani
'使用(Image imgB = Image.FromFile(ImageBack)){//更多代碼在這裏}'會在它離開作用域時自動處理imgB。 – Ian