2010-04-15 90 views
6

我有一個在Windows Server 2008上運行的應用程序,它正在處理上傳的圖像。目前,它每天成功處理大約8000張圖像,爲每張圖像創建11種不同的尺寸。某些圖像在Windows Server 2008上無法加載

我的問題是,有時應用程序無法加載一些圖像,我得到的錯誤「System.Runtime.InteropServices.ExternalException:在GDI +發生了一般性錯誤。」。

上傳只接受帶有JPEG擴展名(jpg/jpeg/jpe)或JPEG MIME類型的文件,並且我可以告訴那些圖像實際上是JPEG圖像。如果我在服務器上的Windows資源管理器中查看映像文件,它可以成功從文件中提取縮略圖,但如果我嘗試打開它,則會收到錯誤消息「這不是有效的位圖文件,或者它的格式是目前不支持。「從油漆。

如果我將圖像複製到我自己的計算機上,運行Windows 7,打開圖像沒有問題。它適用於Paint,Windows照片查看器,Adobe Bridge和Photoshop。如果我嘗試使用Image.FromStream以與在服務器上運行的應用程序相同的方式加載圖像,則它加載得很好。 (我已將文件複製回服務器,但它仍不起作用,所以在複製過程中沒有任何更改。)

當我查看Bridge中的圖像信息時,發現圖像是使用Picasa 3.0創建的,但除此之外,我無法看到它們的任何特別之處。我還沒有發現任何人有同樣的問題,或任何已知的與Picasa應用程序類似的問題。

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

以下是未在服務器上加載的圖像示例:gdi-example.jpg(192 kB)。

+0

有趣。我可以在Windows Server 2008和2003上使用您的示例圖像來確認這一點(儘管圖片查看器在2003年爲我提供了1x1像素的圖像)。無法看到圖像有任何問題。在Windows 7上,它打開罰款。這可能是一些安全相關的GDI補丁或其他東西,但我不知道該怎麼做。 – 2010-04-15 09:25:42

+0

@Pekka:謝謝你的確認,至少我知道問題可能與操作系統版本有關,而不僅僅是這個服務器。 – Guffa 2010-04-15 10:04:21

回答

2

來自專家交流我有一個使用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); 
    } 
} 
0

我覺得一定有什麼東西在Picasa中通過產生的EXIF頭信息。我遇到了同樣的問題 - 處理數以千計的圖像,但偶爾有幾個不想處理。我在這裏使用了克隆修復程序:How can I get .Net to save this image?