2008-09-16 9 views
1

私はc#.netでJPEG画像をシリアライズしています。私は単純にバイトスチームに変換し、Webサービスを通じて送信しています。シリアル化されたバイトストリームは実際のイメージのサイズの30倍以上であることがわかりました。私は、実際のイメージのサイズに比例してシリアライズして滞在するより良いアプローチを提案する人はいますか?イメージをよりコンパクトにシリアル化するにはどうすればよいですか?

+0

バイストリームが30倍大きくなったのをどのように観察しましたか? –

答えて

0

免責事項:たぶん、あなたはデータパケットにプロトコルオーバーヘッドバイトの多くを追加するSOAPのようなものを使用している
そのオープン性/標準規格と性能の間のトレードオフ...を話す非通知人。サイズが重大な制約である場合は、純粋なバイナリストリームとして送信してみてください...実際の構文は他の誰かがピッチする可能性があります。

2

JPEGは圧縮技術であり、それを読み込みます。これはファイル形式の性質です。最初に画像として読み取らずに元のJPEGファイルを送信する方法を見つけてください。

+0

「それを読んだら、大きく拡大するのはなぜですか? – Indy9000

+0

@Indeera、画像としてJPEGファイルを読み込むと、メモリに圧縮されなくなります。たとえば、Windowsのサンプル・イメージTulips.jpgは、ディスク上では620K、メモリ内では2359Kです。 JPEGを作成するときに適用される圧縮パラメータと、非圧縮画像にアルファチャンネルがあるかどうかによって、その差はそれよりはるかに大きくなる可能性があります。それは結局のところ圧縮の全体的なポイントです。 –

2
  1. 元のイメージストリームをFileStreamで読み取ってから、MemoryStreamを使用してシリアライザに渡す必要があります。
  2. Imageクラスのみを使用できる場合は、受信しているバイト配列の出力形式を指定してください。
-1

なぜBase64Stringに変換しませんか?もう一方の端に

byte[] arr = File.ReadAllBytes(filename); 
string str = Convert.ToBase64String(arr); 

あなたが行くことによって、[]バックバイトに、それを変更することができます。

byte[] arr = Convert.FromBase64String(string); 
+1

これをしないでください。エンコードの別のレイヤーを追加するだけでサイズを増やすことができます。 –

0

多分ちょうど、Webサーバー上の画像をホストし、むしろ、Webサービスの応答にURLを送りますシリアライズされたイメージよりもこれにより、クライアントはできるだけイメージをローカルにキャッシュすることができます。

関連する問題