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

StackOverflow https://stackoverflow.com/questions/32750

  •  09-06-2019
  •  | 
  •  

質問

私は持っています byte[] 配列。その内容は TIFF ファイルを表します (たとえば、 BinaryWriter オブジェクト、それは完全に有効な TIFF ファイルを形成します)、それを System.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

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

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

また、先ほども述べたように、この最終目標は、複数ページの TIFF ファイルを表すバイト配列を作成することです。これには、現在バイト配列オブジェクトを持っている TIFF ファイルが含まれています。もっと良い方法があるのなら、私は大賛成です。

役に立ちましたか?

解決

編集: 以下の仮定は正しくありません。後で IDE を起動する機会があり、書き込みの有無でテストしたところ、どちらも MemoryStream に正しく設定されました。

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

あたかも私の記憶(冗談ではありません)が正しく役立つかのように、これは次のとおりです。

MemoryStream ms = new MemoryStream(byteArrayIn);

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

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

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

それで問題が解決するかどうかを確認してください。

他のヒント

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

私が気づかなかったのは、文字列が Base64 でエンコードされていることです。電話をかける Convert.FromBase64String() それがバイト配列に変わってしまい、 Image.FromStream() 方法。

つまり、基本的には私の側の愚かな間違いに帰着しました。しかし、上記のコードは依然として有用であり、このページはおそらく、他の人へのこの間違いを回避する方法に関する Google の結果として機能するでしょう。

また、バイト配列からマルチページ TIFF を構築する簡単な方法も見つけました。 ここ.

これらはすべて、質問と同じ問題である私の問題を理解するのに役立つ手がかりでした。そこで、これらの役立つヒントをもとに私がたどり着いた解決策を投稿したいと思います。これまでに投稿されたすべての手がかりをありがとう!

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

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

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

したがって、バイトの正しい TIFF ストリームは、次の 10 進バイト値で始まります。73、73、42、0 または 77、77、0、42。私たちが経験したのと同じ問題を抱えている人には、TIFF データのバイト ストリームを検査して、データが有効な TIFF データであることを確認することをお勧めします。

シュナップルさんとティム・サンダースさん、ありがとう!!

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top