標籤:
在開發.NET應用中,使用 System.Drawing.Image.Save 方法而導致“GDI+ 中發生一般性錯誤”的發生,通常有以下三種原因:
1. 相應的帳戶沒有寫入權限。
解決方案:賦予 NETWORK SERVICE 帳戶以寫入權限。
2. 指定的實體路徑不存在。
解決方案:
在調用 Save 方法之前,先判斷目錄是否存在,若不存在,則建立。
if (!Directory.Exists(dirpath))
Directory.CreateDirectory(dirpath);
3. 儲存的檔案已存在並因某種原因被鎖定。
解決方案:
重啟IIS,解除鎖定。並在代碼中使用 using 語句,確保釋放 Image 對象所使用的所有資源。
我遇到的情況:
在先用openFileDialog開啟圖片檔案,然後用saveFileDialog儲存檔案時就出現了 “GDI+中發生一般性錯誤”,我當時就想到是開啟的檔案還沒有釋放出來,於是用openFileDialog1.Dispose()來釋放,可是沒有成功。同樣從一個MemorySream 執行個體開啟一個Image後,立即關閉了這個流,結果在Image.Save時也會發生這種錯誤。我“擺渡”了很久都是遇到和我一樣問題的人,CSDN上面的同志也沒有給出一個實用的答案。最後終於還是在微軟的網站上找到了答案:(以下是官方解決辦法)
癥狀
Bitmap 對象或一個 映像 對象從一個檔案, 構造時該檔案仍保留鎖定對於對象的生存期。 因此, 無法更改映像並將其儲存回它產生相同的檔案。
替代方法
• 建立非索引映像。
• 建立索引映像。
這兩種情況下, 原始 位元影像 上調用 Bitmap.Dispose() 方法刪除該檔案上鎖或刪除要求, 流或記憶體保持活動。
建立非索引映像
即使原始映像被索引格式中該方法要求新映像位於每像素 (超過 8 位 -) -, 非索引像素格式。 此變通方法使用 Graphics.DrawImage() 方法來將映像複製到新 位元影像 對象:
1. 構造從流、 從記憶體, 或從檔案原始 位元影像 。
2. 建立新 位元影像 的相同大小, 帶有是超過 8 位 - - 像素 (BPP) 每像素格式。
3. 使用 Graphics.FromImage() 方法以擷取有關二 位元影像 Graphics 對象。
4. 用於 Graphics.DrawImage() 繪製首 位元影像 到二 位元影像 。
5. 用於 Graphics.Dispose() 處置是 圖形 。
6. 用於 Bitmap.Dispose() 是首 位元影像 處置。
建立索引映像
此解決辦法在索引格式建立一個 Bitmap 對象:
1. 構造從流、 從記憶體, 或從檔案原始 位元影像 。
2. 建立新 位元影像 具有相同的大小和像素格式作為首 位元影像 。
3. 使用 Bitmap.LockBits() 方法來鎖定整個映像對於兩 Bitmap 對象以其本機像素格式。
4. 使用 Marshal.Copy 函數或其他記憶體複製函數來從首 位元影像 複製到二 位元影像 映像位。
5. 使用 Bitmap.UnlockBits() 方法可以解鎖兩 Bitmap 對象。
6. 用於 Bitmap.Dispose() 是首 位元影像 處置。
由於外國人的思維和我們不一樣,我重新用執行個體解釋一下,我這裡使用的是建立非索引映像。
private void ToolStripMenuItem_Click(object sender, EventArgs e)
{
if (openFileDialog1.ShowDialog() == DialogResult.OK)
{
//建立一個bitmap類型的bmp變數來讀取檔案。
Bitmap bmp = new Bitmap(openFileDialog1 .FileName );
//建立第二個bitmap類型的bmp2變數,我這裡是根據我的程式需要設定的。
Bitmap bmp2 = new Bitmap(1024, 768, PixelFormat.Format16bppRgb555);
//將第一個bmp拷貝到bmp2中
Graphics draw = Graphics.FromImage(bmp2);
draw.DrawImage(bmp,0,0);
pictureBox1.Image = (Image)bmp2 ;//讀取bmp2到picturebox
FILE = openFileDialog1.FileName;
openFileDialog1.Dispose();
draw.Dispose();
bmp.Dispose();//釋放bmp檔案資源
}
}
通過以上的讀取檔案,在儲存的時候就不會出現錯誤了。
原文連結:GDI+ 中發生一般性錯誤
[轉]GDI+ 中發生一般性錯誤