c# - 如何将具有多种像素格式的多页 tiff 保存为单个像素格式?

标签 c# image bitmap pixelformat

我需要检测多页 tiff 的页面像素格式,如果不是 PixelFormat.Format24bppRgb,则更改它们。通常这对我来说很简单。出于同样的原因,我需要进行转换,我似乎在想出理想的解决方案时遇到了问题。

如果图像的事件帧是PixelFormat.Format1bppIndexed,然后我尝试更改为具有PixelFormat.Format24bppRgbWorkingImage.SelectActiveFrame的帧(FrameDimension.Page, i); 抛出异常。

An unhandled exception of type 'System.Runtime.InteropServices.ExternalException' occurred in System.Drawing.dll

Additional information: A generic error occurred in GDI+.

我想我可以捕获异常并重新打开图像/图像流并继续检查,但我希望这不是我唯一的选择。

非常感谢任何帮助!

最佳答案

至少可以说,使用 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();

关于c# - 如何将具有多种像素格式的多页 tiff 保存为单个像素格式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27993659/

相关文章:

c# - 将域模型类型转换为 ViewModel

c# - 如何检测 DataGridView CheckBox 事件变化?

背景图像的 jquery 选择器

java - 安卓 : Bitmaps transmitted as String causing out of memory errors

android - 从 url 中的 slivers 加载高图像阻止整个图像加载到 ram

c++ - HBITMAP hbm = LoadImage函数返回NULL

c# - 从 Expression<Func<TypeIn, TypeOut1>> 转换为 Expression<Func<TypeIn, TypeOut2>>

c# - 如何验证 MVC 4 模型中的 IEnumerable<string> 属性

java - 如何创建视差图?

Jquery如何在parseHTML时停止自动加载图像