【问题标题】:Convert InputStream to File将 InputStream 转换为文件
【发布时间】:2015-01-03 05:24:26
【问题描述】:

我有一个使用 Jersey 构建的 REST Web 服务,它通过 Tess4J Java 绑定使用 Tesseract 进行 OCR(光学字符识别)。现在,Tess4J 库希望您向它发送一个图像文件(png、jpg、tif 等),但是通过 Jersey 处理,我得到了一个 包含图像的 InputStream。

如何将此 InputStream 转换为 Tesseract 可以识别的文件类型?我尝试了以下方法:

import org.apache.commons.io.IOUtils;

.....

private static File stream2file (InputStream in) throws IOException {            

    final File tempFile = File.createTempFile("stream2file", ".tmp");
    tempFile.deleteOnExit();

    try (FileOutputStream out = new FileOutputStream(tempFile)) {
        IOUtils.copy(in, out);
    }

    return tempFile;            
}

但是随后 Tesseract 库抛出一个异常,指出它不接受我发送的文件类型(在本例中为“tmp”)。我尝试将那个小 'tmp' 更改为 'tif' 和其他受支持的文件类型,但只产生了相同的结果,所以我显然在这里遗漏了一些东西。

那么,我如何获取 InputStream,对其进行转换,然后将其作为它所期望的受支持文件类型之一转发到 Tesseract?

【问题讨论】:

  • 如何从 WebService 调用中获取 InputStream?您是否曾尝试使用 Image Magick 等不同的图像处理工具打开临时文件?您的图像文件(tmp 文件)是否具有预期的大小? ... 顺便提一句。 Java 7 java.nio.file.Files 支持将InputStreams 复制到路径。
  • 我使用 POST 通过表单('multipart/form-data')获取图像。不过,图像没有问题,在我使用 Tess4J 的控制台应用程序中完美运行。我没有尝试过 Image Magick 不,我只是可能会。
  • 并且临时文件的大小和内容与原始文件相同?从命令提示符调用的 tesseract 是否接受临时文件
  • 顺便说一下,.deleteOnExit(); 直到 JVM 成功关闭(并且只有在成功关闭时)才会真正删除临时文件。您应该考虑使用类似try { ... } finally { tempFile.delete(); } 的东西。在deleteOnExithere 上阅读 Oracle 的更多信息。

标签: java web-services jersey inputstream tesseract


【解决方案1】:

临时文件的文件扩展名必须与原始输入图像文件的扩展名匹配。

除了File 类型,Tess4J 还接受BufferedImage 作为输入。只需将 inputstream 转换为它,如下:

BufferedImage image = ImageIO.read(is);

【讨论】:

    【解决方案2】:

    试试(FileOutputStream out = new FileOutputStream(tempFile))。你在这一行有一个错误。 你应该使用FileOutputStream (String) 而不是FileOutputStream(File)。 所以应该是FileOutputStream(tempfile.getName())

    您传递给FileOutputStream 的构造函数的参数是一个字符串,它是真实文件的路径或文件名。这不是 File 对象。

    【讨论】:

      猜你喜欢
      • 2018-11-20
      • 2011-05-18
      • 2015-12-12
      • 2022-01-02
      • 2013-09-18
      • 2014-04-23
      • 2011-08-11
      • 2011-07-09
      • 2018-07-19
      相关资源
      最近更新 更多