我在 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())
我有一个 java 客户端试图读取传输的图像字符串并重新生成 jpeg。然而,这似乎不起作用。我创建了一个 python 客户端只是为了检查,我可以使用对 pygame 的加载方法的调用正确地重新生成 jpeg。 从 python 发送的字符串包含字符 6:10 = JFIF,这是正确的格式(也被 python 的 imghdr 模块识别。 在 Java 中,我已经尝试过了
只需将接收到的字符串的字节内容写入文件,并以 .jpeg 扩展名命名。该文件不是有效的 jpeg。
使用
ImageIO从字符串中读取字节。这会产生一个空图像。尝试获取
ImageReaderByFormat('JPEG')并以此解析字节。这给我一个错误,指出“Image is not a JPEG, starts with 0x...”
我真的不明白为什么 python 将字符串识别为有效的 jpeg 而 java 不识别。两者使用不同的 jpeg 解码器吗?即使他们这样做,难道不应该同时验证或拒绝该字符串吗?
请您参考如下方法:
刚找到解决问题的办法 问题出在 java 中使用的字符集,同时将从我的 python 服务器发送的字符串转换为 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
