Dot-Net

某些圖像無法在 Windows Server 2008 上傳入

  • June 5, 2012

我有一個在 Windows Server 2008 上執行的應用程序,它正在處理上傳的圖像。目前,它每天成功處理約 8000 張圖像,為每張圖像創建 11 種不同尺寸。

我遇到的問題是,有時應用程序無法載入某些圖像,我收到錯誤“System.Runtime.InteropServices.ExternalException:GDI+ 中發生一般錯誤。”。

上傳只接受帶有 JPEG 副檔名 (jpg/jpeg/jpe) 或 JPEG MIME 類型的文件,據我所知,這些圖像實際上是 JPEG 圖像。如果我在伺服器上的 Windows 資源管理器中查看圖像文件,它可以成功地從文件中提取縮略圖,但如果我嘗試打開它,我會收到錯誤消息“這不是有效的點陣圖文件,或者它的格式是目前不支持。” 從油漆。

如果我將圖像複製到我自己的執行 Windows 7 的電腦上,則打開圖像沒有問題。它適用於畫圖、Windows 照片查看器、Adobe Bridge 和 Photoshop。如果我嘗試使用 Image.FromStream 載入圖像,就像在伺服器上執行的應用程序一樣,它載入得很好。(我已將文件複製回伺服器,但仍然無法正常工作,因此復製過程中沒有任何內容會更改它。)

當我查看 Bridge 中的圖像資訊時,我看到這些圖像是使用 Picasa 3.0 創建的,但除此之外我看不出它們有什麼特別之處。我還沒有發現任何人遇到同樣的問題,或者 Picasa 應用程序存在類似的任何已知問題。

有沒有人遇到過類似的問題,或者知道使用 Picasa 創建的圖像是否有什麼特別之處?是否需要在伺服器上安裝任何圖像編解碼器來處理各種 JPEG 圖像?

以下是未在伺服器上傳入的圖像範例:gdi-example.jpg (192 kB)。

從專家交流中,我得到了一個使用 BitmapImage 對象載入圖像並將其重新保存到 MemoryStream 的範例。由於某種原因,BitmapImage 可以載入 Bitmap 對像不能載入的圖像。

我還必須從文件中載入數據並將其作為 MemoryStream 提供給 BitmapImage,這樣它就不會鎖定文件。

所以,這是我現在使用的最終程式碼(沒有一些日誌記錄):

using WpfImaging = System.Windows.Media.Imaging;
...

byte[] data = File.ReadAllBytes(FileName);

Image master;
using (MemoryStream source = new MemoryStream(data)) {
 var img = new WpfImaging.BitmapImage();
 img.BeginInit();
 img.StreamSource = source;
 img.EndInit();
 WpfImaging.BmpBitmapEncoder encoder = new WpfImaging.BmpBitmapEncoder();
 using (MemoryStream m = new MemoryStream()) {
   encoder.Frames.Add(WpfImaging.BitmapFrame.Create(img));
   encoder.Save(m);
   master = new Bitmap(m);
 }
}

引用自:https://stackoverflow.com/questions/2643812