[英]How do I load an enormous image to Java via BufferedImage?
我想将大图像(18000 x 18000)加载到我的应用程序中。 如果我使用类型为int_rgb
BufferedImage
,我需要大约1235mb的堆内存来加载。 这是一个非常大的内存量,最终用户可能会有更少的内存(1GB或更少)。
在我的开发PC上,当我从MyEclipse IDE加载图像时,它会抛出一个内存不足的Exception
。 当我将我的代码打包到一个可执行jar并在Eclipse外部的PC上运行时,它仍然会抛出异常。
如何在不使用1235mb内存的情况下使用缓冲图像将如此大的图像加载到我的应用程序中? 有没有一个技巧,比如将图像分成像图像分割这样的较小部分?
我在SO上找到了这个帖子 ,但它对我没用; 我想将图像加载到BufferedImage
,然后使用Graphics
类在Panel
上绘制它。
您可以使用ImageIO
包中的ImageReadParam读取和显示图像的片段。 这是一个基本示例,说明如何使用ImageReadParam
读取单个片段而不读取整个图像:
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.imageio.ImageReadParam;
import javax.imageio.ImageReader;
import javax.imageio.stream.ImageInputStream;
import javax.swing.*;
public class TestImageChunks {
private static void createAndShowUI() {
try {
URL url = new URL(
"http://duke.kenai.com/wave/.Midsize/Wave.png.png");
Image chunk = readFragment(url.openStream(), new Rectangle(150,
150, 300, 250));
JOptionPane.showMessageDialog(null, new ImageIcon(chunk), "Duke",
JOptionPane.INFORMATION_MESSAGE);
} catch (IOException e) {
JOptionPane.showMessageDialog(null, e.getMessage(), "Failure",
JOptionPane.ERROR_MESSAGE);
e.printStackTrace();
}
}
public static BufferedImage readFragment(InputStream stream, Rectangle rect)
throws IOException {
ImageInputStream imageStream = ImageIO.createImageInputStream(stream);
ImageReader reader = ImageIO.getImageReaders(imageStream).next();
ImageReadParam param = reader.getDefaultReadParam();
param.setSourceRegion(rect);
reader.setInput(imageStream, true, true);
BufferedImage image = reader.read(0, param);
reader.dispose();
imageStream.close();
return image;
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
createAndShowUI();
}
});
}
}
结果如下:
通常,您需要执行以下操作:
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.