web-dev-qa-db-ja.com

Eof for JPG画像を検出する

私は多くの画像をTCPを介してサーバーからクライアントに連続的に送信しています。クライアントでは、これが私の1つの画像の終わりであることを効率的に検出するにはどうすればよいですか。

宜しくお願いします、 ...

22
Zai

まあ、jpegイメージ内でFFD9が見つからないという保証はありません。 jpegイメージの終わりを見つける最良の方法は、それを解析することです。 FFD0からFFD9およびFF01(予約済み)を除くすべてのマーカーの直後に、長さ指定子が続きます。長さ指定子は含まれますが、マーカーは含まれません。 FF00はマーカーではありませんが、長さ指定子なしでマーカーとして扱うことができます。

長さ指定子は2バイト長で、ビッグエンディアンです。したがって、FFを検索し、次のバイトが0x00、0x01、または0xD0-0xD8のいずれでもない場合は、長さ指定子を読み取り、長さ指定子がマイナス2バイトを示す限り、ストリームを前方にスキップします。

また、すべてのマーカーには、最初に任意の数のFFを埋め込むことができます。

FFD9に到達すると、ストリームの終わりにいます。

もちろん、ストリームをWordごとに読み取り、パフォーマンスが必要な場合はFFを検索することもできますが、それは読者の練習として残しておきます。 ;-)

33
onemasse

WikipediaのJPEG記事 をざっと見ると、答えがわかります。

  • バイト0xFF、0xD8は画像の開始を示します
  • バイト0xFF、0xD9は画像の終わりを示します
16
darioo

バイト配列を介して画像を送信する場合は、ファイルの開始前に、画像のファイルサイズをバイトのペアとして追加するだけです。
クライアントは最初の2バイトを取得して、指定されたバイト数を検索し(これをxと呼びます)、それらを破棄してから、次のxバイト数をバッファーに送ります。ファイルに書き込むことができます。
以下のすべてのJPEGをすすぎ、繰り返します。

別の方法は、FFD9マーカーを探すだけです。誤っていない場合、圧縮された値FFはFF00としてエンコードされます(00バイトは破棄され、FFバイトは保持されます)。
これの問題は、独自のFFD9ヘッダーを持つサムネイルのようなものを取得することですが、それらはヘッダーのセグメント内に含まれています。これらのセグメントには、マーカーの後に2バイトの長さの値があるため、発生するセグメントの最後までスキップして、早期のEoi検出を回避できます。

1
TheHitchenator