2009-04-24 4 views
1

私は、クライアントからの接続を待っているサーバを持っていて、Socketクラスを使ってそのクライアントに画像を送信します。Javaで画像を圧縮して送信しますか?

いくつかのクライアントが短時間で接続するため、送信する前に画像を圧縮したいと思います。

イメージは1000×1000ピクセルのBufferedImagesです。私の現在の送信方法は、すべてのピクセルを繰り返し、その値を送信して、もう一方のサイドで再構成することです。私はこれが最善の方法ではないと思う。

誰でも圧縮やネットワーク経由で画像を送信するためのより良い方法についてアドバイスできますか?

ありがとうございました。

答えて

0

Javaで画像処理を行って以来、ずっと時間がかかっていますが、画像をJPEGとしてサーバーに保存し、URIを送信して自分自身で取り出すことができます。

3

JPEGがロスであるため、反対側で全く同じイメージが必要な場合は、ソケットのOutputStreamの上にあるGZIPOutputStreamを使用して圧縮データを送信し、もう一方のGZIPInputStreamを介して受信しますソケットのInputStreamの値。

0

SocketでgetInputStreamおよびgetOutputStreamメソッドを使用している場合は、ストリームをjava.util.net.GZIPInputStreamおよびjava.util.net.GZIPOutputStreamでラップしてみてください。

4

圧縮は、コースにとって非常に馬です:最初の場所で画像がどこから来たかによって、どの方法が実際にうまくいくのですか?また、あなたの要件は何ですか(主に、損失圧縮を許可するかどうか、あなたはそれに置く)。 ImageIO.write()を使用して、JPEGまたはPNG形式の画像をByteArrayOutputStreamに書き込んで、その結果のバイト配列をソケット[1]に送信できます。それがあなたに受け入れられる結果をもたらすならば、利点は、それは開発時間が無駄になるということです。

損失のある圧縮を使用できないため、またはPNG圧縮で許容される圧縮率が得られないために、許容できる結果が得られない場合は、適切な結果が得られない場合は、データ;その時点で。あなたは一日の終わりにあなたのデータを知っているだけですが、一般的なテクニックは、デフラータや他の標準的なアルゴリズムでうまく動作するような形でデータを取得しようとすることです。たとえば、デフレーターでは、データの変換/並べ替えを行い、類似したバイトの繰り返しパターンと実行がお互いに近くなるようにします。つまり、ピクセルの上位ビットすべてを送信し、次にすべての次のビットなどを送信し、事実上ノイズだけであれば、実際には各コンポーネントの下位ビットを送信しないことを意味します。

JPEG/PNGオプションを使用すると、必要な結果が得られますので、それ以上の心配はありません。

[1]申し訳ありませんが、あなたは明らかに画像データが書き込まれているものをソケット出力ストリームにすることができます。 。