程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> C# 圖片資源無法釋放問題

C# 圖片資源無法釋放問題

編輯:C#入門知識

最近在用C#做圖片編輯功能時候,遇到一個很奇怪的問題。

由於需要對電腦本地圖片修改後進行保存,所以采用最簡單的方法,就是把圖片加載到PictureBox,編輯之後調用Image類的Save方法直接覆蓋原文件保存。這種方法在XP系統及管理權限用戶登錄的Win7系統上都正常,後來在普通權限用戶登錄的Win7系統上出現“A generic error occurred in GDI+”的錯誤。經過跟蹤調試,確定是在Image類的Save方法進行覆蓋式保存時出錯。後來換了一種折衷的實現方法,就是在覆蓋保存時,先把原文件刪除,然後把Image中的圖像按原路徑保存。這方法不會出現前面的GDI+錯誤,但在刪除原文件時卻出現“The process cannot access the file 'x:\xx.jpg' because it is being used by another process.”。相關代碼如下:

 Image Src_Pic = Image.FromFile(fileName);
 bgBMP = new Bitmap((Image)Src_Pic.Clone());
 Src_Pic.Dispose();
在這裡已經把原文件的Image對象Src_Pic釋放掉,只是把其數據填充到Bitmap對象中,按道理應該不會出現在刪除對應文件時出現資源無法訪問的問題。估計調用的Clone方法還是關聯到原文件路徑。(我是C#新手,研究還不夠深,只能暫時猜測哈)

後來再找了個折衷方法,手動實現"Clone"。部分代碼如下:

Image Src_Pic = Image.FromFile(fileName);
bgBMP = new Bitmap(Src_Pic.Width, Src_Pic.Height);
Graphics g = Graphics.FromImage(bgBMP);
g.DrawImage(Src_Pic, new Rectangle(0, 0, Src_Pic.Width, Src_Pic.Height));
Src_Pic.Dispose();
這次再刪除原文件就不會出現無法釋放的問題了。

以上觀點可能有錯誤,歡迎大家討論指出。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved