从InputStream创建PDImageXObject

4

我正在尝试从巨大的JPEG文件(20,000 x 20,000像素[24位颜色])创建PDImageXObject

方法:

这些方法会创建ByteArrayInputStream对象并分配超过1GB的内存,可能会导致异常。

java.lang.OutOfMemoryError: Java heap space
at java.io.ByteArrayOutputStream.<init>(ByteArrayOutputStream.java:77) ~[?:1.8.0_211]

该行代码出现异常:

buf = new byte[size];

我知道图像处理的字节数 = W * H * color bits \ 9;

这就是为什么我不想一次性加载所有文件字节。

我尝试将最大堆大小设置为-Xmx2G,但这还不够。我还尝试使用以下方法:LosslessFactory.createFromImage(...)JPEGFactory.createFromImage(...) ,但它们都有同样的问题。

是否有方法可以从InputStream(例如从FileInputStream)创建PDImageXObject,而不必创建BufferedImage或字节数组?

1个回答

1
生成一个线程来运行命令行实用程序(例如ImageMagick),该程序将缩小图像的大小,以适应您为图像分配的页面空间。
然后加载缩小后的图像。
您不需要比页面上适合的更高分辨率或更大尺寸的图像。
还有几个Java库可以在没有显著的进程生成开销的情况下为您完成这项工作。请参阅此Baeldung文章,快速了解更流行的方法:Baeldung: How can I resize an image using Java? 当然,您需要进行实验,以查看每个库使用多少主内存。

所以对我的问题的回答就是,我不能直接从库中获得输入流,我需要强制通过 BufferedImage 或其他工具来传递,或者使用另一个工具来提取图像。这有点不幸。 - verodigiorgio

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接