2

マルチページ tiff のページ ピクセル フォーマットを検出し、そうでない場合は変更する必要がありPixelFormat.Format24bppRgbます。通常、それは私が行うのに十分簡単です。変換を行う必要があるのと同じ理由で、理想的な解決策を見つけるのに問題があるようです。

画像のアクティブなフレームが で、そのPixelFormat.Format1bppIndexedフレームに変更しようとするとPixelFormat.Format24bppRgbWorkingImage.SelectActiveFrame(FrameDimension.Page, i);例外がスローされます。

System.Drawing.dll で、タイプ 'System.Runtime.InteropServices.ExternalException' の未処理の例外が発生しました

追加情報: GDI+ で一般的なエラーが発生しました。

例外をキャッチして画像/画像ストリームを再度開いてチェックを続けることができると思いますが、これが私の唯一の選択肢ではないことを願っています.

どんな助けでも大歓迎です!

4

1 に答える 1

2

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();
于 2015-01-23T14:06:21.317 に答える