GDI+中发生一般性错误的解决办法 from http://www.cnblogs.com/winzheng/archive/2008/12/23/1360440.html...
GDI+中發生一般性錯誤的解決辦法
這個錯誤經常發生,代碼如下:
?
???private??static??byte[]?GetBytes?(Image?image)
????????{
????????????try
????????????{
????????????????if?(image?==?null)?return?null;
????????????????using?(MemoryStream?stream?=?new?MemoryStream())
????????????????????{
????????????????????????image?.Save(stream,?ImageFormat.Jpeg);
????????????????????????return?stream.GetBuffer();
????????????????????}
????????????}
????????????finally
????????????{
????????????????if(image?!=?null)
????????????????{
????????????????????image.Dispose();
????????????????????image?=?null;
????????????????}
????????????}
????????}
?
修改后的代碼如下:
?
???private??static??byte[]?GetBytes?(Image?image)
????????{
????????????try
????????????{
????????????????if?(image?==?null)?return?null;
????????????????using(Bitmap?bitmap?=?new?Bitmap(image))
????????????????{
????????????????????using?(MemoryStream?stream?=?new?MemoryStream())
????????????????????{
????????????????????????bitmap.Save(stream,?ImageFormat.Jpeg);
????????????????????????return?stream.GetBuffer();
????????????????????}
????????????????}
????????????}
????????????finally
????????????{
????????????????if(image?!=?null)
????????????????{
????????????????????image.Dispose();
????????????????????image?=?null;
???????????????}
????????????}
????????}
?
MSDN 解釋如下:
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() 是首 位圖 處置。
創建非索引圖像,例如:
Code??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文件資源
??????????}
?
?
如果是在Web 程序中注意這些設置:
1. 相應的帳戶沒有寫權限。
解決方法:賦予 NETWORK SERVICE 帳戶以寫權限。
2. 指定的物理路徑不存在。
解決方法:
在調用 Save 方法之前,先判斷目錄是否存在,若不存在,則創建。
if (!Directory.Exists(dirpath))
Directory.CreateDirectory(dirpath);
轉載請注明原創地址:http://www.cnblogs.com/winzheng/archive/2008/12/23/1360440.html
重新啟動IIS.
?
?
轉載于:https://www.cnblogs.com/songtzu/archive/2013/01/06/2847162.html
總結
以上是生活随笔為你收集整理的GDI+中发生一般性错误的解决办法 from http://www.cnblogs.com/winzheng/archive/2008/12/23/1360440.html...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: MVC中helper的用法。
- 下一篇: Undefined exploded a