【发布时间】:2017-06-26 15:19:29
【问题描述】:
我一直在开发一个应用程序,该应用程序采用可能非常大的 TIFF 文件并将其拆分为多个较小的文件。为此,它需要遍历所有页面(BufferedImage 对象)并执行一些操作来确定是否应在此处启动新文件或此特定页面是已创建文件的一部分。
显然我无法将整个文件加载到内存中——这就是为什么我只使用ImageIO 读取它的一页。我用方法创建了一个 util 类:
public static BufferedImage getSinglePageFromTiffFile(File file, int pageIndex) throws IOException {
ImageInputStream is = ImageIO.createImageInputStream(file);
ImageReader reader;
try {
reader = ImageIO.getImageReaders(is).next();
reader.setInput(is);
return reader.read(pageIndex);
} finally {
if(is != null) is.close();
}
}
public static int getNumPages(File file) throws IOException {
ImageInputStream is = ImageIO.createImageInputStream(file);
ImageReader reader;
try {
reader = ImageIO.getImageReaders(is).next();
reader.setInput(is);
return reader.getNumImages(true);
} finally {
if(is != null) is.close();
}
}
要将页面写入文件,我使用 ImageWriter 类,如下所示:
int pagesQty = ImageUtils.getNumPages(documentToSplit);
int currentPageIndex = 0;
final ImageWriter writer = ImageIO.getImageWritersByFormatName(resultsExtension).next();
final ImageWriteParam writeParams = writer.getDefaultWriteParam();
writeParams.setCompressionMode(ImageWriteParam.MODE_COPY_FROM_METADATA);
BufferedImage page = ImageUtils.getSinglePageFromTiffFile(file, currentPageIndex);
while(currentPageIndex < pagesQty) {
OutputStream outStream = null;
ImageOutputStream imgOutStream = null;
final File newDocFile = new File(pathName);
try {
outStream = new FileOutputStream(newDocFile);
imgOutStream = ImageIO.createImageOutputStream(outStream);
writer.setOutput(imgOutStream);
writer.prepareWriteSequence(null);
writer.writeToSequence(new IIOImage(page, null, null), writeParams);
currentPageIndex++;
while(currentPageIndex < pagesQty) {
page = ImageUtils.getSinglePageFromTiffFile(documentToSplit, currentPageIndex);
if(NEWPAGE) {
writer.endWriteSequence();
break;
}
writer.writeToSequence(new IIOImage(page, null, null), writeParams);
}
} finally {
if(imgOutStream != null) imgOutStream.close();
if(outStream != null) outStream.close();
}
}
}
我对这种方法的保留适用于内存使用。在处理文件时,最多分配了 2GB 内存。平均大约 1 - 1.5GB。有没有办法在内存使用方面更有效地执行这些操作?
【问题讨论】:
标签: java memory tiff javax.imageio