GDI +中發生了一般性錯誤首先,我已閱讀了有關此特定問題的現有StackOverflow答案。這些答案的共識似乎是關於權限或現有文件等...我已經消除了所有這些問題。在Bitmap.Save
基本上,這裏的流程如下:
該應用程序需要一個24位的PNG文件和讀取它變成一個位圖對象時,bmpOriginal。
該應用保存bmpOriginal使用JPG編碼器(從通過ImageCodecInfo.GetImageEncoders()循環,直到我發現了一個與「圖像/ JPEG」 Mime類型而獲得的內存流。
該應用程序創建新的Bitmap,bmpOptimized,從步驟2中的內存流中顯示出來,然後顯示在PictureBox中。到目前爲止,這麼好 - 一切都按預期工作,我甚至可以在新的Bitmap中看到JPG壓縮瑕疵,所以我知道編碼器正在工作。
在代碼流的後面,用戶單擊一個按鈕,它應該將bmpOptimized保存到一個新文件中,使用Bitmap.Save()me的ThOD。
當我運行它時,它會拋出一個關於「GDI +中發生的一般性錯誤」的錯誤。
我仔細檢查,確保文件夾是可寫的,並且文件不存在。實際上,應用程序實際上確實在正確的位置創建了一個文件,但它是空的(0字節)。
,似乎奇怪唯一的其他事情是,bmpOriginal和bmpOptimized都具有相同的RawFormat值:
{[的imageformat:b96b3caf-0728-11d3-9d7b-0000f81ef32e]}
...即使bmpOriginal來自PNG,而bmpOptimized來自編碼的JPEG。
編輯: 的代碼看起來是這樣的:
public Bitmap bmpOriginal;
public Bitmap bmpOptimized;
...
// Step 1
bmpOriginal = new Bitmap("foo.png");
// Step 2
using(MemoryStream ms = new MemoryStream())
{
ImageCodecInfo _jpgEncoder = _getEncoder("image/jpeg");
EncoderParameters _encoderParams = new EncoderParameters(1);
_encoderParams.Param[0] = new EncoderParameter(Encoder.Quality, 70L);
bmpOriginal.Save(ms, _jpgEncoder, _encoderParams);
// Step 3
bmpOptimized = new Bitmap(ms);
}
再後來就當用戶點擊該按鈕第4步:
bmpOptimized.Save("bar.jpg");
...這就是錯誤發生。
請注意,此編輯只是簡單地添加流程的簡化版本,因爲人們顯然由於缺乏源代碼而低估了此問題。一個人評論實際上提供了正確的答案 - 我需要保留MemoryStream,直到我保存了優化後的位圖。
請檢查'內存流'是否'處置',直到'bmpOptimized'圖像獲取保存在所需的位置。此外,請參閱此[鏈接](https:// stackoverflow。com/questions/44592550 /無法解決-a-generic-error-in-gdi-when-save-image-in-web-api) –
這幾乎肯定是問題所在。創建位圖對象後,我沒有保留內存流。我會在今天覈實 - 謝謝! – jhilgeman
@BalagurunathanMarimuthu - 就是這樣。我原來的代碼有一個using()塊中的MemoryStream,所以之後它就被清除了。一旦我保存了內存流,它工作得很好!你可以添加你的評論作爲答案,所以我可以將其標記爲答案並且贊成嗎? – jhilgeman