2012-01-04

關於【在 GDI+ 中發生泛型錯誤】出現的問題

System.Runtime.InteropServices.ExternalException: 在 GDI+ 中發生泛型錯誤
在網頁上處理影像檔案時遇過 "在 GDI+ 中發生泛型錯誤" 的錯誤。
GDI 的全名是 Graphics Device Interface 的縮寫,是在 Windows 平台內十分重要的核心元件,負責處理許多跟影像物件有關的工作,包括繪製直線、曲線、字型、材質、處理縮圖、裁切圖片、...等。而 GDI+[1] 則是以 C++ 語言所開發的 GDI 介面,可直接利用系統硬體(顯示卡)資源對圖片相關操作進行加速處理[2]

在 .NET Framework Base Class Library 中所有與繪圖有關的類別 (System.Drawing 命名空間) 也都幾乎不是 Managed 組件,幾乎都是透過 Unmanaged GDI+ 元件進行圖形操作,所以只要發生 GDI+ 的錯誤就一定不是 .NET 程式語法的錯誤,而且錯誤訊息是直接從 GDI+ 傳來的,繁體的作業系統就會回應中文訊息、英文的作業系統就會回應英文訊息,透過 Thread.CurrentThread.CurrentCulture 是沒辦法指定錯誤訊息的。



  • 與『檔案系統』有關的問題

    • 目錄權限不足,無法寫入或無法讀取 ( 包括把檔案寫入 UNC 路徑 )
      解決之道
      : 設定正確可讀取或寫入的權限
    • 檔案權限不足,無法寫入或無法讀取 ( 包括把檔案寫入 UNC 路徑 )
      解決之道: 設定正確可讀取或寫入的權限
    • 目錄不存在,所以根本無法寫入檔案
      解決之道: 先建立目錄,然後再進行寫入 ( Image.Save , Bitmap.Save )


  • 與『圖檔格式』有關的問題

  • 透過 Image.FromStream 載入圖片時,其 Stream 無法使用 Seek 方法
    解決之道: 將無法 Seek Stream 先寫入 MemoryStream 再進行載入即可。在 MSDN 上  Image.FromStream 的備註有寫:「在 Image 的存留期內,資料流都必須保持開啟。」
    [1] http://msdn.microsoft.com/en-us/library/ms533798(VS.85).aspx
    [2] Graphics Device Interface - Wikipedia, the free encyclopedia

    沒有留言:

    張貼留言