2017-09-25 81 views
1

GDI +中發生了一般性錯誤首先,我已閱讀了有關此特定問題的現有StackOverflow答案。這些答案的共識似乎是關於權限或現有文件等...我已經消除了所有這些問題。在Bitmap.Save

基本上,這裏的流程如下:

  1. 該應用程序需要一個24位的PNG文件和讀取它變成一個位圖對象時,bmpOriginal。

  2. 該應用保存bmpOriginal使用JPG編碼器(從通過ImageCodecInfo.GetImageEncoders()循環,直到我發現了一個與「圖像/ JPEG」 Mime類型而獲得的內存流。

  3. 該應用程序創建新的Bitmap,bmpOptimized,從步驟2中的內存流中顯示出來,然後顯示在PictureBox中。到目前爲止,這麼好 - 一切都按預期工作,我甚至可以在新的Bitmap中看到JPG壓縮瑕疵,所以我知道編碼器正在工作。

  4. 在代碼流的後面,用戶單擊一個按鈕,它應該將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,直到我保存了優化後的位圖。

+2

請檢查'內存流'是否'處置',直到'bmpOptimized'圖像獲取保存在所需的位置。此外,請參閱此[鏈接](https:// stackoverflow。com/questions/44592550 /無法解決-a-generic-error-in-gdi-when-save-image-in-web-api) –

+0

這幾乎肯定是問題所在。創建位圖對象後,我沒有保留內存流。我會在今天覈實 - 謝謝! – jhilgeman

+0

@BalagurunathanMarimuthu - 就是這樣。我原來的代碼有一個using()塊中的MemoryStream,所以之後它就被清除了。一旦我保存了內存流,它工作得很好!你可以添加你的評論作爲答案,所以我可以將其標記爲答案並且贊成嗎? – jhilgeman

回答

1

嘗試以下

此請檢查是否memory stream沒有disposed直到bmpOptimized圖像獲取保存在所需位置。如果問題仍然存在,那麼Check if path exists.

相關問題