Skip to main content
 首页 » 编程设计

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

2025年05月04日23lvdongjie

我在 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 中,我已经尝试过了

  1. 只需将接收到的字符串的字节内容写入文件,并以 .jpeg 扩展名命名。该文件不是有效的 jpeg。

  2. 使用ImageIO 从字符串中读取字节。这会产生一个空图像。

  3. 尝试获取 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