2015-02-05 119 views
1

我是一個相對的新手,在C#中進行圖像處理。這是我在成爲會員很長時間後在這個董事會上的第一個問題。我希望它能幫助我解決這個棘手的情況。C#通用GDI +使用Image.Save時出錯()

我需要讀取多頁TIFF的內容(幀),將每一個保存到一個List中,最後返回它然後做一些工作。

繼承人到目前爲止我的代碼

public static List<Image> GetAllPages(string file) 
{ 
    images = new List<Image>(); 
    using (Image img = Image.FromFile(file)) 
    { 
     try 
     { 
      for (int i = 0; i < img.GetFrameCount(FrameDimension.Page); i++) 
      { 
       img.SelectActiveFrame(FrameDimension.Page, i); 
       MemoryStream byteStream = new MemoryStream(); 
       img.Save(byteStream, ImageFormat.Tiff); 
       images.Add(Image.FromStream(byteStream)); 
      } 
     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
     } 
    } 
    return images; 
} 

重要 - 這在Windows 7上運行時,但是,試圖在Windows XP相同的,當我得到了seemedly衆所周知通用GDI實際工作就像一個魅力+錯誤。

有什麼明顯的我在這裏失蹤?如果沒有,是否還有其他更有效的方式來返回從多頁Tiff中提取的圖像列表?

我將不勝感激任何人都可以給的幫助。

+3

XP有一箇舊版本的GDI +,v1.00。您已經在v1.10上測試過您的代碼,這是一個大大改進的版本。任何事情都是可能的,就像你忘記了byteStream.Position = 0;有一個影響。對於特定的TIFF,它是成千上萬不兼容文件格式的首字母縮寫。請大家幫忙,停止支持XP。 – 2015-02-05 22:47:02

+0

@HansPassant我讀過關於GDI +版本的情況。我希望有人能夠指出一些明顯的錯誤。我很樂意停止支持XP,但不幸的是,在這種特殊情況下,我不是那種做出這種選擇的人。 我會測試包括你建議的線路。 – user3095888 2015-02-05 23:08:49

+0

如果其他人可以提供一些進一步的見解,而不是簡單地告訴我(可能有成千上萬的人)停止支持XP - 我會非常感激! – user3095888 2015-02-08 17:04:27

回答

1

Hans Passant在評論中有2個有用的信息位。首先,TIFF格式支持無數的子類型和變體,而不是所有這些都由GDI +支持。其次,GDI +在XP之後得到了改善,但並不是無處不在。

您的代碼在Windows XP和Windows 7上都能正常工作,但只能使用正確的輸入TIFF文件。

我使用帶有2個輸入文件的.NET 2.0和.NET 4.0程序對其進行了測試。第一個文件有6頁,全部用LZW壓縮編碼。該文件在Windows 7和XP上都可以使用。

第二個文件有11個頁面,包含11種不同類型的編碼。在Windows XP上,只有11頁中的7頁正確加載。 在Windows 7上,更少的頁面工作,但特別是JPEG壓縮工作正常,雖然它在XP下失敗。

Windows 8.1的表現比兩者都好,並設法正確加載8頁。

您可以找到這些文件與此頁面上所使用的壓縮類型的列表一起: http://support.leadtools.com/CS/forums/44475/ShowPost.aspx

當然還有其他的TIFF子類型,其中大部分是不GDI支持+本身,但是,這11是更常見的格式之一。

這給我們留下了讓您的文件在Windows XP上工作的問題。由於他們在Windows 7上工作,所以很有可能你有一個在Windows 7上工作的TIF子類型,但不是XP,比如JPEG壓縮。如果是這種情況,僅使用.NET是不夠的,您可能不得不使用專用的映像或TIFF庫來加載這些文件。

+0

這非常有幫助。非常感激。事實證明,問題在於JPEG壓縮文件--XP/GDI1.0似乎不喜歡那樣。爲了解決這個問題,至少在短期內,我會先安排使用LZW創建的文件,然後再通過我的應用。 – user3095888 2015-02-14 15:46:44

+0

使用LZW的好處是,與JPEG不同,它是無損的,這意味着像素完整性不會因重複處理或保存而降低。但是有一個缺點就是它在大多數圖像上產生比JPEG大的文件。 – 2015-02-18 21:43:34

相關問題