当前位置: 首页 > 面试题库 >

JAI:如何从多页TIFF图像容器中提取单页输入流?

白迪
2023-03-14
问题内容

我有一个将PDF文档转换为图像的组件, 每页一个图像 。由于该组件使用生成内存映像的转换器,因此它严重打击了JVM堆,并需要一些时间来完成转换。

我试图改善转换过程的整体性能,并发现了一个具有JNI绑定的本机库,可将PDF转换为TIFF。该库只能将PDF转换为单个TIFF文件(需要中间文件系统存储;甚至不消耗转换流),因此结果TIFF文件已嵌入已转换的页面,而不是文件系统上的每页图像。拥有本机库可以显着提高整体转换速度,并且性能会提高得更快,但是存在一个真正的瓶颈:因为我必须进行从源页面到目标页面的转换,所以现在我必须从结果文件中提取每个页面并编写他们都在别处。使用RenderedImages的简单天真方法:

final SeekableStream seekableStream = new FileSeekableStream(tempFile);
final ImageDecoder imageDecoder = createImageDecoder("tiff", seekableStream, null);
...
//                                               V--- heap is wasted here
final RenderedImage renderedImage = imageDecoder.decodeAsRenderedImage(pageNumber);
// ... do the rest stuff ...

实际上,我真的只是想从TIFF容器文件(tempFile)中提取具体的页面输入流,然后将其重定向到其他位置,而不必将其存储为内存中图像。我会想象一种类似于容器处理的方法,在这种方法中,我需要寻找一个特定的条目来从中提取数据(例如,诸如ZIP文件处理之类的东西)。但是我在中找不到类似的内容ImageDecoder,或者我的期望可能有误,只是这里缺少一些重要的东西…

是否可以使用JAI API或第三方替代方法来提取TIFF容器页面输入流?提前致谢。


问题答案:

我可能是错的,但不要认为JAI支持在不将文件解码为内存图像的情况下拆分TIFF。而且,很抱歉推广我自己的库,但是我认为它完全可以满足您的需要(用于拆分TIFF的解决方案的主要部分是由第三方提供的)。

通过使用TIFFUtilitiesfrom中的类com.twelvemonkeys.contrib.tiff,您应该能够将多页TIFF拆分为多个单页TIFF,如下所示:

TIFFUtilities.split(tempFile, new File("output"));

不对图像进行解码,仅将每个IFD拆分为一个单独的文件,并使用已校正的偏移量和字节数写入流。

文件将被命名output/0001.tifoutput/0002.tif等等。如果你需要输出的名字更多的控制权或有其他要求,可以很容易地修改代码。该代码带有BSD样式的许可证。



 类似资料:
  • 问题内容: 一直在撕我的头发。 如何将多页/多层TIFF图像分成几个单独的图像? 演示图像在这里。 (宁愿使用纯Java(即非本机)解决方案。该解决方案是否依赖于商业库也没关系。) 问题答案: 您可以使用 Java高级映像 库JAI通过使用ImageReader分割多页TIFF: 然后,您可以获得页面数: 并分别阅读页面:

  • 问题内容: 我想更改多页TIFF图像的高度,所以我在下面的代码段中进行缩放。但是它仅从tiff文件返回第一页,我想它会将其转换为JPEG图像。如何保留文件的所有页面? 更新的代码: 问题答案: 只会写入单个独立映像。将多个图像写入同一输出流并不能解决此问题。但是,ImageIO软件包完全支持您所需的内容,只需要更多代码即可。 使用以下命令获取适用于TIFF格式的格式: 有关更多信息,请参见Imag

  • 问题内容: 我有5张单页tiff图片。我想将所有这5张tiff图片合并为一张多页tiff图片。我正在使用Java Advanced Imaging API。我已经阅读了SUN提供的JAI API文档和教程。我是JAI的新手。我知道Java的基本核心。我不了解SUN提供的这些文档和资料。所以,朋友们请告诉我如何将5个tiff图像文件合并为一个多页tiff图像。请给我一些有关上述主题的指导。我一直在互

  • 我需要压缩一个有几个灰色16bit图像(多页)的tif文件。我已经尝试使用ImageIO如下所示:使用Java ImageIO进行Tiff压缩最初,tif文件中的每个图像都来自另一个Tiff文件。当我想使用压缩机时,我有以下选项: null

  • 问题内容: 我正在用Java开发一个应用程序,该应用程序可以从不同的网页获取文本信息并将其汇总为一页。例如,假设我在不同的网页(例如印度教,印度时报,政治家等)上都有新闻。该应用程序应该从这些页面的每个页面中提取要点,并将它们整合为一条新闻。该应用程序基于Web内容挖掘的概念。作为该领域的初学者,我不知道从哪里开始我浏览了一些研究论文,这些论文将消除噪声作为构建此应用程序的第一步。 因此,如果给我

  • 问题内容: 我有一个很大的摆动组件要写入TIFF。该组件是太大,无法加载TIFF在内存中,所以我要么需要使这是由一个基于磁盘的备份的WritableRaster(如提到一个大的BufferedImage这里,或者使用JAI。 除了项目完全混乱之外,JAI似乎是更好的答案。 鉴于此,有人可以概述在不耗尽内存的情况下将我的swing组件写入图块TIFF的步骤吗? 图片大小可能是10000x700 理想