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

使用JAI将摆动分量写入大型TIFF图像

陆啸
2023-03-14
问题内容

我有一个很大的摆动组件要写入TIFF。该组件是太大,无法加载TIFF在内存中,所以我要么需要使这是由一个基于磁盘的备份的WritableRaster(如提到一个大的BufferedImage这里,或者使用JAI。

除了项目完全混乱之外,JAI似乎是更好的答案。

鉴于此,有人可以概述在不耗尽内存的情况下将我的swing组件写入图块TIFF的步骤吗?

图片大小可能是10000x700

理想情况下,我将创建某种基于磁盘的映像,并将部分组件写入其中,每次写入都刷新到磁盘上。

编辑

我想可以用ImageWriter做到这一点,但是我在调​​用时遇到了NoSuchElementException:

ImageWriter imageWriter = ImageIO.getImageWritersByFormatName("tif").next();

我的类路径上有jai_code.jar和jai_core.jar罐子,还有其他需要做的事情吗?

编辑 我可以使用JAI创建非常大的TIFF,但是JAI不支持TIFF压缩,因此文件为92 MB。

如果安装JAI-ImageIO,则可以使用ImageWriter创建压缩的TIFF,但只能从没有足够内存的Raster或BufferedImage创建。

有什么方法可以执行两步操作,使用JAI创建大型TIFF,然后压缩大型TIFF,而无需将整个内容加载到内存中?


问题答案:

我必须使用JAI加载并存储一个大型tiff(59392x40192px)。我的解决方案是:TiledImages。

我使用了TiledImage,因为我需要图块和子图像。为了高效使用TiledImage,您应该使用自己喜欢的图块大小来构建它。JAI使用TileCache,因此不需要时不会将整个Image都存储在内存中。

要将TiledImage写入文件,请使用选项“ writeTiled”(避免OutOfMemory,因为它会逐块写入):

public void storeImage(TiledImage img, String filepath) {
    TIFFEncodeParam tep = new TIFFEncodeParam();
    //important to avoid OutOfMemory
    tep.setTileSize(256, 256);
    tep.setWriteTiled(true);
    //fast compression
    tep.setCompression(TIFFEncodeParam.COMPRESSION_PACKBITS);
    //write file
    JAI.create("filestore", img, filepath, "TIFF", tep);
}

对于最大690mb(压缩)的图像,它可以正常工作,对于尚未测试的较大图像。

但是,如果您使用的是32位WinXP,则可能无法提供1280m HeapSpace大小,这仍然是Java VM的限制。

我的TiledImage是使用我的图像源数据中的IndexedColorModel构建的:

//here you create a ColorModel for your Image
ColorModel cm = source.createColorModel();
//then create a compatible SampleModel, with the tilesize
SampleModel sm = cm.createCompatibleSampleModel(tileWidth,tileHeight);

TiledImage image = new TiledImage(0, 0, imageWidth, imageHeight, 0, 0, sm, cm);


 类似资料:
  • 问题内容: 我尝试了以下代码来完成读取和写入tiff图像的任务: 但是,当我运行代码时,出现以下错误消息: 知道如何解决这个问题吗? 问题答案: 读取TIFF并输出BMP的最简单方法是使用ImageIO类: 要使此功能正常工作,您唯一需要做的另一件事是确保已将JAI ImageIO JAR添加到类路径中,因为如果没有此库中的插件,JRE不会处理BMP和TIFF。 如果由于某种原因不能使用JAI I

  • 问题内容: 我有一个将PDF文档转换为图像的组件, 每页一个图像 。由于该组件使用生成内存映像的转换器,因此它严重打击了JVM堆,并需要一些时间来完成转换。 我试图改善转换过程的整体性能,并发现了一个具有JNI绑定的本机库,可将PDF转换为TIFF。该库只能将PDF转换为单个TIFF文件(需要中间文件系统存储;甚至不消耗转换流),因此结果TIFF文件已嵌入已转换的页面,而不是文件系统上的每页图像。

  • 问题内容: 我正在尝试将大的ResulSet(〜1mm行)写入单个文件。在Java 1.6中,有没有一种首选/有效的方法来做到这一点? 问题答案: 这取决于所使用的JDBC驱动程序。您需要指示JDBC驱动程序 不要事先将其全部加载到Java内存中,而应在每次调用时逐行加载。然后,在循环内部,您需要 立即 将数据写入文件,而不是将其保存在文件中。 不清楚您使用的是哪种JDBC驱动程序,但是例如,可以

  • 问题内容: 我正在向stdin写入大量数据。 我如何确保它不会阻塞? 我读了一个大字符串并将其写入后,似乎无法解决。 我有大量的文件集,这些文件将被顺序写入stdin(> 1k个文件) 所以发生的事情是我正在运行一个循环 它以某种方式挂在文件号上。400.该文件是带有长字符串的大文件。 我确实怀疑这是一个阻碍性问题。 仅当我从0迭代到1000时才会发生这种情况。但是,如果我要从文件400开始,则不

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

  • 我试图使用open JDK11ImageIO、ImageReader和ImageWriter类将多个输入TIFF文件合并为一个多页输出TIFF文件。我的例程对从许多不同品牌的扫描设备创建的几乎所有示例输入文件都能正常工作。这些设备使用旧的和新的JPEG压缩生成各种TIFF文件。然而,来自一个特定设备的TIFF文件会导致具有粉红色背景的错误输出。更奇怪的是,用纵向扫描产生的TIFF会产生正确的输出,