6

私はbyte[]配列を持っており、その内容はTIFFファイルを表しています(オブジェクトを使用してこれらのバイトをファイルに直接書き出すとBinaryWriter、完全に有効なTIFFファイルが形成されます)、それをシステムに変換しようとしています後で操作するために使用できるように、.Drawing.Image オブジェクト (複数ページの TIFF オブジェクトへのフィード)

私が抱えている問題は、このタスクの一般的に受け入れられているコードです。

    public Image byteArrayToImage(byte[] byteArrayIn)
    {
        MemoryStream ms = new MemoryStream(byteArrayIn);
        Image returnImage = Image.FromStream(ms, true);
        return returnImage;
    }

私にはうまくいきません。メソッドを呼び出す上記のメソッドの 2 行目は、Image.FromStream実行時に終了します。

Parameter Not Valid

FromStreamこれがTIFFファイルであるという事実でメソッドが窒息していると思いますが、メソッドがこの事実を受け入れるようにする方法がわかりません。

TIFF イメージのバイト配列を Image オブジェクトに変換するにはどうすればよいですか?

また、私が言ったように、これの最終目標は、現在バイト配列オブジェクトを持っている TIFF ファイルを含むマルチページ TIFF ファイルを表すバイト配列を持つことです。これを行うためのより良い方法があれば、私はそれで大賛成です。

4

3 に答える 3

3

OK、問題が見つかりました。それは、私が質問していたコードの一部とは無関係のコードの一部からのものでした。データは文字列として渡され、それをバイト配列に変換し (これはテスト リグだったので、メイン アプリで取得するバイト配列をシミュレートしようとしていました)、それを MemoryStream に変換してから、そこからのイメージ。

私が気づかなかったのは、文字列が Base64 でエンコードされていたことです。呼び出しConvert.FromBase64String()により、メソッドを強制終了しないバイト配列に変わりましたImage.FromStream()

つまり、基本的には私の愚かな間違いに要約されました。しかし、上記のコードはまだ有用であり、このページはおそらく、この間違いを他の誰かに回避する方法に関する Google の結果として役立つでしょう.

また、バイト配列hereからマルチページ TIFF を作成する簡単な方法を見つけました。

于 2008-08-28T18:58:10.257 に答える
2

編集:以下の仮定は正しくありません。後で IDE を起動し、Write を使用した場合と使用しない場合でテストしたところ、両方とも MemoryStream が正しく読み込まれました。

最初に MemeoryStream に書き込む必要があると思います。

私の記憶(しゃれた意図はありません)がこれを正しく提供しているかのように:

MemoryStream ms = new MemoryStream(byteArrayIn);

そのサイズのメモリ ストリームを作成します。

次に、バイト配列の内容をメモリ ストリームに書き込む必要があります。

ms.Write(byteArrayIn, 0, byteArrayIn.Length);

それが修正されるかどうかを確認してください。

于 2008-08-28T17:15:42.530 に答える
1

これらはすべて、質問が尋ねるのと同じ問題である私の問題を理解するのに役立つ手がかりでした. これらの役立つ手がかりのために、私がたどり着いた解決策を投稿したいと思います。これまでに投稿されたすべての手がかりに感謝します!

Time Saunders が彼の回答に投稿したように、実際にバイトをメモリ ストリームに書き込む Write メソッドは不可欠です。それが私の最初の間違いでした。

それから私のデータも悪いTIFFデータでしたが、私の場合、画像データの先頭に余分な文字13がありました。それを削除すると、すべてうまくいきました。

基本的な TIFF ファイル形式の仕様について読んだとき、TIFF ファイルは II または MM (値が 73 または 77 の 2 バイト) で始まる必要があることがわかりました。II は、リトル エンディアン バイト オーダー (「Intel バイト オーダー」) が使用されることを意味します。MM は、ビッグエンディング (「Motorola バイト順」) が使用されることを意味します。次の 2 バイトは、42 の 2 バイト整数値 (= .NET では Int16)、バイナリ 101010 です。

したがって、バイトの正しい TIFF ストリームは、73、73、42、0 または 77、77、0、42 の 10 進数のバイト値で始まります。TIFF データ バイト ストリームを調べて、データが有効な TIFF データであることを確認してください。

シュナップルとティム・サンダースに感謝!!

于 2014-02-17T20:10:15.710 に答える