2

Python サーバーで PIL イメージ文字列を作成します。

frame = cv.CaptureFromCAM(0)
image = Image.fromstring('RGB', cv.GetSize(frame), frame.tostring(), 'raw', 'BGR')
buffer = cStringIO.stringIO()
image.save(buffer,'JPEG')
udptransmit(buffer.getvalue())

送信された画像文字列を読み取って jpeg を再構築しようとしている Java クライアントがあります。ただし、これは機能していないようです。確認のためだけに Python クライアントを作成しました。pygame の load メソッドの呼び出しを使用して、jpeg を正しく再構築できます。Python から送信される文字列には、文字 6:10 = JFIF が含まれています。これは正しい形式です (Python の imghdr モジュールでも認識されます。Java では、試してみました

  1. 受信した文字列のバイト コンテンツをファイルに書き込み、拡張子 .jpeg を付けて名前を付けるだけです。ファイルは有効な jpeg ではありません。

  2. ImageIO文字列からバイトを読み取るために使用します。これにより、ヌル イメージが生成されます。

  3. ImageReaderByFormat('JPEG')これでバイトをフェッチして解析しようとしました。Image is not a JPEG, starts with 0x...これにより、「 」というエラーが表示されます

Pythonが文字列を有効なjpegとして認識し、Javaが認識しない理由が本当にわかりません。この 2 つは異なる jpeg デコーダーを使用していますか? たとえそうであっても、文字列を検証または拒否するべきではありませんか?

4

1 に答える 1

0

問題の解決策が見つかりました 問題は、Pythonサーバーから送信された文字列をJavaでバイトに変換する際に、Javaで使用される文字セットにありました。私のJavaクライアントコードで必要な簡単な変更は次のとおりです。

Charset charset = Charset.forName("ISO-8859-1");
Byte[] bytes: Array[Byte] = cam_data.getBytes(charset)
File f = new File("image.jpeg")
FileImageOutputStream fios = new FileImageOutputStream(f)
BufferedImage  bim = ImageIO.read(new ByteArrayInputStream(bytes))
ImageIO.write(bim,"jpeg",fios)

答えにつながる便利なリンクはhttp://www.java-forums.org/advanced-java/50516-reading-image-files-into-strings.htmlでした

于 2012-07-26T14:26:20.677 に答える