2008-08-28 18 views
4

BinaryWriterオブジェクトを使用してこれらのバイトを直接ファイルに書き出すと、TIFFファイルの内容が完全に有効なTIFFファイルを形成するように、内容がbyte[]の配列があります。 System.Drawing.Imageオブジェクトにそれは私が(マルチTIFFオブジェクトへの供給)後の操作のためにそれを使用できるように私がいる問題があるTIFFイメージのバイト配列を取得し、それをSystem.Drawing.Imageオブジェクトに変換するにはどうすればよいですか?

、このタスクのために一般的に受け入れられているコード:

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

は私にとっては機能しません。

Parameter Not Valid 

が、私はこの方法が、これはTIFFファイルであるが、私が作る方法を見つけ出すことができないという事実に窒息されていることを信じていると言って、それはImage.FromStreamメソッドが実行時に死ぬ呼び出し、上記の方法の2行目、 FromStreamメソッドはこの事実を受け入れます。

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

また、最終的な目標は、現在のバイト配列オブジェクトを持つTIFFファイルを含むマルチページTIFFファイルを表すバイト配列を持つことです。もしこれをやるより良い方法があれば、私はそれをすべて得ます。

答えて

2

編集:以下の前提が正しくないと、私は後でIDEを起動し、Writeの有無にかかわらずテストを行い、MemoryStreamに正しく挿入されました。

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

として私の記憶が(しゃれが意図していない)が正しく、この私を提供する場合:

MemoryStream ms = new MemoryStream(byteArrayIn); 

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

その後、メモリストリームに、あなたのバイト配列の内容を記述する必要があります。それはそれを修正する場合

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

を参照してください。

+0

パフォーマンスを向上させるには、ms.Writeを再度呼び出す代わりにms.Lengthとms.Positionを設定します。 –

3

OK、私は問題を発見しました。そして、私が尋ねていたコードの部分とは無関係なコードの部分からでした。データは文字列として渡されていましたが、これをバイト配列に変換していました(これはテストリグでしたので、メインアプリケーションでバイト配列をシミュレートしようとしていました)、それをMemoryStreamに変換してからそこからのイメージ

文字列がBase64でエンコードされていることがわかりませんでした。 Convert.FromBase64String()を呼び出すと、それはImage.FromStream()メソッドを殺さないバイト配列になりました。

だから、基本的にそれは私の愚かなミスに沸った。しかし、ねえ、上のコードはまだ有用であり、このページはおそらく他の誰かにこのミスを避けるためのGoogleの結果として役に立つでしょう。

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

1

これらすべてが私の問題を理解するのに役立つ手がかりであり、質問と同じ問題でした。だから私は私がこれらの役に立つ手がかりのために到着した私のソリューションを投稿したい。これまでに投稿されたすべての手がかりをありがとう!

タイム・サンダースが彼の答えに掲載したように、実際にバイトをメモリ・ストリームに書き込むためのWriteメソッドは必須です。それが私の最初の間違いでした。

私のデータも悪いTIFFデータでしたが、私の場合は、画像データの先頭に余分な文字がありました。一度それを取り除くと、それはすべて私のためにうまくいった。

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

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

ありがとうSchnappleとTim Saunders !!

関連する問題