我有13255张图片,每张240 x 240像素宽,最大为15412字节,最小为839字节。
我试图循环遍历文件夹,将它们添加到一个File[]中。一旦我有了每个图像的数组,我就将它们放入一个BufferedImage[]中,准备循环遍历并绘制成由每个单独图像组成的更大的单一图像。
每个图像的命名形式如下:
Image x-y.png
然而,我不断遇到java.lang.OutOfMemoryError:Java堆空间错误。我不知道为什么。我尝试通过在Eclipse目标的末尾添加参数来修改JVM可用内存大小。以下是我使用的内容:
任何关于我做错了什么的想法都将不胜感激。
敬礼,
Jamie
我试图循环遍历文件夹,将它们添加到一个File[]中。一旦我有了每个图像的数组,我就将它们放入一个BufferedImage[]中,准备循环遍历并绘制成由每个单独图像组成的更大的单一图像。
每个图像的命名形式如下:
Image x-y.png
然而,我不断遇到java.lang.OutOfMemoryError:Java堆空间错误。我不知道为什么。我尝试通过在Eclipse目标的末尾添加参数来修改JVM可用内存大小。以下是我使用的内容:
IDE's\eclipse-jee-juno-SR2-win32-x86_64\eclipse\eclipse.exe -vmargs -Xms64m -Xmx1024m
and
IDE's\eclipse-jee-juno-SR2-win32-x86_64\eclipse\eclipse.exe -vmargs -Xms64m -Xmx4096m
两者都没有效果。我还进入了控制面板 -> 程序 -> Java 并更改了可用内存的数量。
这是我编写的方法:
public static void merge_images() throws IOException {
int rows = 115;
int cols = 115;
int chunks = rows * cols;
System.out.println(chunks);
int chunkWidth, chunkHeight;
int type;
// fetching image files
File[] imgFiles = new File[chunks];
int count = 0;
for (int j = 1; j <= 115; j++) {
for (int k = 1; k <= 115; k++) {
imgFiles[count] = new File("G:\\Images\\Image " + j
+ "-" + k + ".png");
count++;
}
}
System.out.println(imgFiles.length);
// creating a buffered image array from image files
BufferedImage[] buffImages = new BufferedImage[chunks];
for (int i = 0; i < chunks; i++) {
buffImages[i] = ImageIO.read(imgFiles[i]);
System.out.println(i);
}
type = buffImages[0].getType();
chunkWidth = buffImages[0].getWidth();
chunkHeight = buffImages[0].getHeight();
// Initializing the final image
BufferedImage finalImg = new BufferedImage(chunkWidth * cols,
chunkHeight * rows, type);
int num = 0;
for (int i = 0; i < rows; i++) {
for (int k = 0; k < cols; k++) {
finalImg.createGraphics().drawImage(buffImages[num], null,
chunkWidth * k, chunkHeight * i);
num++;
}
}
System.out.println("Image concatenated.....");
ImageIO.write(finalImg, "png", new File("fusions.png"));
System.out.println("Image Saved, Exiting");
}
在这里打印行
for (int i = 0; i < chunks; i++) {
buffImages[i] = ImageIO.read(imgFiles[i]);
System.out.println(i);
}
它总是在大约7320点停止。
以下是确切的控制台输出
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at java.awt.image.DataBufferByte.<init>(Unknown Source)
at java.awt.image.ComponentSampleModel.createDataBuffer(Unknown Source)
at java.awt.image.Raster.createWritableRaster(Unknown Source)
at javax.imageio.ImageTypeSpecifier.createBufferedImage(Unknown Source)
at javax.imageio.ImageReader.getDestination(Unknown Source)
at com.sun.imageio.plugins.png.PNGImageReader.readImage(Unknown Source)
at com.sun.imageio.plugins.png.PNGImageReader.read(Unknown Source)
at javax.imageio.ImageIO.read(Unknown Source)
at javax.imageio.ImageIO.read(Unknown Source)
at main.merge_images(main.java:48)
at main.main(main.java:19)
任何关于我做错了什么的想法都将不胜感激。
敬礼,
Jamie