2015-01-16 33 views
1

我需要檢測多頁tiff的頁面像素格式,如果它們不是PixelFormat.Format24bppRgb,則更改它們。通常這對我來說會很簡單。出於同樣的原因,我需要進行轉換,我似乎遇到了一個理想解決方案的問題。如何將多頁像素格式的多頁TIFF保存爲單像素格式?

如果圖像的活動幀是PixelFormat.Format1bppIndexed,然後我嘗試更改爲具有PixelFormat.Format24bppRgb,WorkingImage.SelectActiveFrame(FrameDimension.Page, i);的幀,則會引發異常。

類型 'System.Runtime.InteropServices.ExternalException' 的未處理的異常發生在System.Drawing.dll程序

附加信息:在GDI +發生一般性錯誤。

我想我可以捕捉到異常並重新打開圖像/圖像流並繼續檢查,但我希望這不是我唯一的選擇。

任何幫助非常感謝!

回答

1

使用System.Drawing處理多頁TIF可能會很棘手。這可能就是爲什麼有專用的圖像庫,其中包含更多精細的TIFF支持。 下面的代碼可能不是您的特定問題的理想解決方案,但在使用具有1位,8位和24位頁面的TIFF文件進行測試時,它可以工作,並將它們全部轉換爲24位。該代碼創建新的24位頁面並將它們全部附加到新文件中,從而保持原始狀態不變。

if (System.IO.File.Exists(outputTif)) 
    System.IO.File.Delete(outputTif); 
Bitmap img = new Bitmap(inputTif); 
Bitmap multiPageImage = (Bitmap)img.Clone(); 
multiPageImage.SelectActiveFrame(FrameDimension.Page, 0); 
Bitmap firstPage = new Bitmap(multiPageImage.Width, multiPageImage.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb); 
Graphics g = Graphics.FromImage(firstPage); 
g.DrawImageUnscaled(multiPageImage, 0, 0); 
g.Dispose(); 
ImageCodecInfo TiffCodec = null; 
foreach (ImageCodecInfo codec in ImageCodecInfo.GetImageEncoders()) 
    if (codec.MimeType == "image/tiff") 
    { 
     TiffCodec = codec; 
     break; 
    } 
EncoderParameters parameters = new EncoderParameters(2); 
parameters.Param[0] = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.MultiFrame); 
parameters.Param[1] = new EncoderParameter(Encoder.ColorDepth, (long)24); 
//save the first page in a new file 
firstPage.Save(outputTif, TiffCodec, parameters); 
parameters = new EncoderParameters(2); 
parameters.Param[0] = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.FrameDimensionPage); 
parameters.Param[1] = new EncoderParameter(Encoder.ColorDepth, (long)24); 
var pageCount = multiPageImage.GetFrameCount(System.Drawing.Imaging.FrameDimension.Page); 
//now append pages from second to last 
for (int i = 1; i < pageCount; ++i) 
{ 
    multiPageImage = (Bitmap)img.Clone(); 
    multiPageImage.SelectActiveFrame(FrameDimension.Page, i); 
    Bitmap nextPage = new Bitmap(multiPageImage.Width, multiPageImage.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb); 
    g = Graphics.FromImage(nextPage); 
    g.DrawImageUnscaled(multiPageImage, 0, 0); 
    g.Dispose(); 
    firstPage.SaveAdd(nextPage, parameters); 
    nextPage.Dispose(); 
} 
parameters = new EncoderParameters(2); 
parameters.Param[0] = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.Flush); 
parameters.Param[1] = new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.LastFrame); 
firstPage.SaveAdd(parameters); 
firstPage.Dispose();