2009-05-31 15 views
1

私はバイト配列(データ)にファイルを抽出する関数を持っています。C#ビットマップイメージ、バイト配列およびストリーム!

 int contentLength = postedFile.ContentLength; 
     byte[] data = new byte[contentLength]; 
     postedFile.InputStream.Read(data, 0, contentLength); 

その後、私は

 MemoryStream ms = new MemoryStream(data); 
     Image bitmap = Image.FromStream(ms); 

(データはバイト配列である場合)System.Drawing.Imageオブジェクト を構築するために、このバイト配列を使用して、私は次の例外「ArgumentExceptionが出ます:パラメータは有効ではありません"

元掲示ファイルは500K JPEG画像が含まれてい...

任意のアイデアこのありえないが働いて、なぜ?

注:バイト配列に変換してからmemorystreamに変換する正当な理由があることを保証します。

+0

データに画像データのみが含まれていますか?あなたは 'postedFile'がどんなタイプであるかは言いません。 – ChrisF

+1

このエラーはどこにありますか?投稿したコードはうまくいくはずです... –

+0

postedFileはHttpPostedFileBaseです。 このエラーは、次の行に発生します。Imageビットマップ= Image.FromStream(ms); :( – iasksillyquestions

答えて

5

これは、すべてのファイルデータをバイト配列に入れなかったためです。 Readメソッドは、要求するバイト数を返す必要はなく、実際に配列に格納されたバイト数を返します。

int contentLength = postedFile.ContentLength; 
byte[] data = new byte[contentLength]; 
for (int pos = 0; pos < contentLength;) { 
    pos += postedFile.InputStream.Read(data, pos, contentLength - pos); 
} 

これは、ストリームから読み取るときのよくある間違いです。すべてのデータを取得するまでループする必要があります。私はこの問題を何度も見てきました。

編集:マシューが示唆されているように、ストリームの早期終了をチェックして
は、コードは次のようになります。

int contentLength = postedFile.ContentLength; 
byte[] data = new byte[contentLength]; 
for (int pos = 0; pos < contentLength;) { 
    int len = postedFile.InputStream.Read(data, pos, contentLength - pos); 
    if (len == 0) { 
     throw new ApplicationException("Upload aborted."); 
    } 
    pos += len; 
} 
+0

使用さ示唆コード: INTん。ContentLength = postedFile.ContentLength; バイト[]データ=新しいバイト[ん。ContentLength]; ため(int型POS = 0; POS <ん。ContentLength、POS ++){ POS + = postedFile.InputStream。読み込み(data、pos、contentLength - pos); } リターンデータ。 まだ動作しませんでした。 – iasksillyquestions

+0

また、ストリームの終わりに早期にヒットした場合に備えて、0の戻り値もチェックする必要があります。 –

+0

Isnt 0は有効な値ですか? – iasksillyquestions

1

postedFile.InputStreamの戻り値はチェックしていません。 Readではありません。は、最初の呼び出しで配列を満たすことが保証されていません。それはデータに破損したJPEGを残します(ファイルの内容ではなく0です)。

0

もっと堅牢なイメージライブラリで開くことができた.NETでイメージを読み込む際に問題が発生しました。あなたが持っている特定のJPEG画像が.NETでサポートされていない可能性があります。 jpegファイルは単なるエンコーディングの一種ではなく、様々な可能な圧縮方式があります。

サポートされている形式であることがわかっている別のイメージで試すことができます。

1

Read()コールからの戻り値を調べて、実際にすべてのコンテンツを読み取っていることを確認しましたか?おそらくRead()はストリームの一部だけを返すので、すべてのバイトが消費されるまでRead()呼び出しをループする必要があります。

1

あなたは、単にこれを行わない理由はどれ理由:

Image bitmap = Image.FromStream(postedFile.InputStream); 
+0

>注意:バイト配列 >に変換してからmemorystreamに変換する理由があります。 – snarf

関連する問題