2011-08-24 85 views
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 +中發生的一般錯誤」。我嘗試了很多和搜索瀏覽器。我無法解決我的問題。謝謝

+0

我可以建議在最後使用()而不是所有的配置嗎?它可能會使它更清晰一些,並確保您正確地解決所有問題。你的應用程序的內存使用情況如何,就像你使用過這種方法的內存一樣? – Ian

+0

你是什麼意思使用()?是可以用來代替dispose()的方法嗎? 關於內存使用情況:在開始時,內存使用量爲6mb,發生異常時爲18mb。 – Lakshani

+0

'使用(Image imgB = Image.FromFile(ImageBack)){//更多代碼在這裏}'會在它離開作用域時自動處理imgB。 – Ian

回答

2

GDI +中的通用錯誤是一個可怕的錯誤,因爲它沒有提供有關發生錯誤的信息。

但是,一個常見原因是從文件加載位圖可能會使該文件處於打開狀態,因此任何後續嘗試打開文件都會導致拒絕訪問。

看到這些相關答案:
- A generic error occurred in GDI+
- Generic GDI+ Error

只要搜索在StackOverflow的 「一般錯誤GDI +」,你會發現相當多的點擊量。

相關問題