PIL保存的jpeg字符串无法在java中读取

时间:2012-07-26 02:28:19

标签: java python image jpeg python-imaging-library

我在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的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...'

  4. 我真的不明白为什么python将字符串识别为有效的jpeg而java则不然。这两个使用不同的jpeg解码器吗?即使他们这样做,也不应该同时验证或拒绝字符串?

1 个答案:

答案 0 :(得分:0)

刚刚找到问题的解决方案 问题在于java中使用的charset将我的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