1

Bob Powell のコードを使用して、既存の画像から複数ページの 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 を作成し、そのフレームの代わりに自分の画像を追加することを念頭に置いています。

4

2 に答える 2

1

[コメント後に最初の部分を削除]

私はLibTIFF.NETを使用して複数ページの TIFF を扱っています。標準ライブラリを使用した TIFF の処理に多くの素早さを見つけました (16 ビット グレー スケール イメージでのメモリ関連および一貫したクラッシュ)。

あなたのテスト画像は何ですか?多くのフレームの tiff を試しましたか (できれば、最初のフレームに大きな「1」、次のフレームに「2」などを使用します。これは、ファイルに含まれるフレームを確認するのに役立ちます。

もう 1 つの有用な診断は、LibTiff バイナリ (Windows 用) に含まれている tiffdump ユーティリティです。これにより、使用しているフレームが正確にわかります。

c# から LibTiff を使用してタイル化された tiff 画像にアクセスするを参照してください。

[編集] .NET の内容を理解したい場合: 標準の .NET 機能を使用した複数ページの tiff に関する新しいリソースを見つけました (ただし、LibTIFF.NET に固執します) : -page TIFF file...ダウンロードした場合、Form1.cs 関数 saveMultipage(..) のコード スニペットはコードと似ています (ただし、わずかに異なります)。特に最後のフラッシュは別の方法で行われ、ファイルは最初のフレームの前に削除されます... [/編集]

于 2010-01-25T19:42:04.410 に答える
0

このプロセスは画像オブジェクトを変更しないようですが、ストリームを変更するため、メモリ ストリーム バッファーを取得して別の画像オブジェクトを作成する必要があります。

var buffer=stream.GetBuffer();
using(var newStream=new MemoryStream(buffer))
{
var result=Image.FromStream(newStream);
}

結果にはすべてのフレームが含まれるようになりました。

于 2010-01-25T07:12:42.830 に答える