最近在用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();這次再刪除原文件就不會出現無法釋放的問題了。
以上觀點可能有錯誤,歡迎大家討論指出。