Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/317.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过BuffereImage将一个巨大的映像加载到Java?_Java_Image_Image Processing_Java 2d - Fatal编程技术网

如何通过BuffereImage将一个巨大的映像加载到Java?

如何通过BuffereImage将一个巨大的映像加载到Java?,java,image,image-processing,java-2d,Java,Image,Image Processing,Java 2d,我想将大图像(18000 x 18000)加载到我的应用程序中。如果使用类型为int\u rgb的buffereImage,则需要大约1235mb的堆内存来加载。这是一个非常大的内存量,最终用户的ram可能会更少(1GB或更少) 在我的开发PC上,当我从MyEclipse IDE加载图像时,它抛出内存不足的异常。当我将代码打包到一个可执行jar并在Eclipse外部PC上运行它时,它仍然会抛出一个异常 如何在不使用1235mb内存的情况下,使用缓冲映像将如此大的映像加载到应用程序中?有没有一个技

我想将大图像(18000 x 18000)加载到我的应用程序中。如果使用类型为
int\u rgb
buffereImage
,则需要大约1235mb的堆内存来加载。这是一个非常大的内存量,最终用户的ram可能会更少(1GB或更少)

在我的开发PC上,当我从MyEclipse IDE加载图像时,它抛出内存不足的异常。当我将代码打包到一个可执行jar并在Eclipse外部PC上运行它时,它仍然会抛出一个异常

如何在不使用1235mb内存的情况下,使用缓冲映像将如此大的映像加载到应用程序中?有没有一个技巧,比如像图像分割一样将图像分割成更小的部分


我发现了,但它对我没用;我想将图像加载到
BufferedImage
中,然后使用
Graphics
类在
面板上绘制图像。

通常,您需要执行以下操作:

  • 将映像拆分为可管理大小的映像文件,并将它们与应用程序一起存储在磁盘上
  • 显示此图像的特定部分时,仅加载和显示与视口重叠的图像片段
  • 在图像周围平移时,适当更新加载和显示的图像片段
  • 要么让GC收集不必要的图像片段,要么加载新的图像片段,使其覆盖旧的图像片段。(最后一个问题是,加载到池内存缓冲区中的图像片段大小相同。)

您可以使用from
ImageIO
软件包读取和显示图像片段。下面是一个基本示例,说明如何使用
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();
            }
        });
    }
}
结果如下所示:


我同意你的理论。事实上,我很高兴我一直在朝着同样的方向思考,但你能给我一个例子或代码片段吗?谢谢你的宝贵意见,我会尝试一下&让你知道。我成功地实现了你的解决方案,它起了作用。请在这个问题上也帮助我