【问题标题】:PIL saved jpeg string cannot be read in java在java中无法读取PIL保存的jpeg字符串
【发布时间】:2012-07-26 02:28:18
【问题描述】:

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

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

【问题讨论】:

  • 也许您遇到了字节顺序问题?
  • 你是用wb写文件吗?
  • OpenCV 不能进行 JPEG 编码吗?看起来 PIL 是一个不必要的依赖。
  • 好吧,我确实尝试将 cv.captureFromCam() 本身的帧作为字符串传输,但是,1. 它仍然不起作用,2. 大小要大得多。但是我不确定 opencv 和 jpeg 编码
  • 对于文件写入,我使用了FileOutputStream,它不需要wb或任何其他模式(据我所知)

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


【解决方案1】:

刚刚找到解决问题的方法 问题在于 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

【讨论】:

    猜你喜欢
    • 2020-12-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-07
    • 2019-07-14
    • 1970-01-01
    • 1970-01-01
    • 2021-05-13
    相关资源
    最近更新 更多