複数ページの tiff の生成が機能しない
質問
を使用して既存の画像から複数ページの TIFF ファイルを生成しようとしています ボブ・パウエルによるコード:
picture.SelectActiveFrame(FrameDimension.Page, 0);
var image = new Bitmap(picture);
using (var stream = new MemoryStream())
{
ImageCodecInfo codecInfo = null;
foreach (var imageEncoder in ImageCodecInfo.GetImageEncoders())
{
if (imageEncoder.MimeType != "image/tiff") continue;
codecInfo = imageEncoder;
break;
}
var parameters = new EncoderParameters
{
Param = new []
{
new EncoderParameter(Encoder.SaveFlag, (long) EncoderValue.MultiFrame)
}
};
image.Save(stream, codecInfo, parameters);
parameters = new EncoderParameters
{
Param = new[]
{
new EncoderParameter(Encoder.SaveFlag, (long) EncoderValue.FrameDimensionPage)
}
};
for (var i = 1; i < picture.GetFrameCount(FrameDimension.Page); i++)
{
picture.SelectActiveFrame(FrameDimension.Page, i);
var img = new Bitmap(picture);
image.SaveAdd(img, parameters);
}
parameters = new EncoderParameters
{
Param = new[]
{
new EncoderParameter(Encoder.SaveFlag, (long)EncoderValue.Flush)
}
};
image.SaveAdd(parameters);
stream.Flush();
}
しかし、それは機能せず(画像には最初のフレームのみが含まれています)、その理由はわかりません。
私がやりたいのは、TIFF ファイルの特定のフレームを変更する (注釈を追加する) ことです。
もっと簡単な方法があるかどうかはわかりませんが、私が考えているのは、元の画像から複数ページの TIFF を作成し、そのフレームの代わりに独自の画像を追加することです。
解決 2
これは、このプロセスは、イメージオブジェクトを変更しないようですが、私はメモリストリームバッファを取得し、別の画像オブジェクトを構築する必要がありますので、それは、ストリームを変更します:
var buffer=stream.GetBuffer();
using(var newStream=new MemoryStream(buffer))
{
var result=Image.FromStream(newStream);
}
さて結果はすべてのフレームが含まれます。
他のヒント
[コメント後の最初の部分を削除]
私は複数ページの TIFF を使用して作業しています リブTIFF.NET;標準ライブラリを使用した TIFF の処理で多くのクイックな方法を見つけました (メモリ関連および 16 ビット グレー スケール イメージでの一貫したクラッシュ)。
テスト画像は何ですか?多数のフレームの TIFF を試してみましたか (できれば最初のフレームに大きな「1」、次のフレームに「2」など)これは、ファイルに含まれるフレームを確認するのに役立ちます。
もう 1 つの有用な診断は、LibTiff バイナリ (Windows 用) に含まれている tiffdump ユーティリティです。これにより、どのフレームがあるかが正確にわかります。
見る C# から LibTiff を使用してタイル化された tiff イメージにアクセスする
[編集] .NET について理解したい場合は、次のようにします。標準の .NET 機能を使用して、マルチページ tiff で新しいリソースを見つけました (ただし、LibTIFF.NET を使い続けるつもりです)。 コードプロジェクト:画像を複数ページの TIFF ファイルに保存します... ダウンロードすると、Form1.cs 関数 saveMultipage(..) のコード スニペットは、実際のコードと似ています (ただし、若干異なります)。特に最後のフラッシングは別の方法で行われ、最初のフレームの前にファイルが削除されます...[/編集]