2015-01-16 31 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();