使用Java 2D可以创建图像的最大大小是多少?
我使用的是Windows 7 Pro 64位操作系统和JDK 1.6.0_33,64位版本。我可以创建一个最大5 MB大小的BufferedImage。除此之外,我得到OutOfMemoryError。
请指导我如何使用Java 2D或JAI创建更大尺寸的图像。
这是我的尝试。
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;
public class CreateBiggerImage
{
private String fileName = "images/107.gif";
private String outputFileName = "images/107-Output.gif";
public CreateBiggerImage()
{
try
{
BufferedImage image = readImage(fileName);
ImageIO.write(createImage(image, 9050, 9050), "GIF", new File(System.getProperty("user.dir"), outputFileName));
}
catch (Exception ex)
{
ex.printStackTrace();
}
}
private BufferedImage readImage(String fileName) throws Exception
{
BufferedImage image = ImageIO.read(new File(System.getProperty("user.dir"), fileName));
return image;
}
private BufferedImage createImage(BufferedImage image, int outputWidth, int outputHeight) throws Exception
{
int actualImageWidth = image.getWidth();
int actualImageHeight = image.getHeight();
BufferedImage imageOutput = new BufferedImage(outputWidth, outputHeight, BufferedImage.TYPE_INT_RGB);
Graphics2D g2d = imageOutput.createGraphics();
for (int width = 0; width < outputWidth; width += actualImageWidth)
{
for (int height = 0; height < outputHeight; height += actualImageHeight)
{
g2d.drawImage(image, width, height, null);
}
}
g2d.dispose();
return imageOutput;
}
public static void main(String[] args)
{
new CreateBiggerImage();
}
}
答案 0 :(得分:2)
您可以使用Java 2D创建的图像的“最大尺寸”取决于很多事情......所以我会在这里做一些假设(如果我错了,请纠正我):
BufferedImage
根据这些假设,理论极限由(width * height * bits per pixel / bits in transfer type) == Integer.MAX_VALUE
给出(换句话说,您可以创建的最大数组)。例如,对于TYPE_INT_RGB
或TYPE_INT_ARGB
,每个像素使用32位,传输类型也是32位。对于TYPE_3BYTE_RGB
,您将使用每像素24位,但传输类型仅为8位,因此最大大小实际上更小。
理论上你可能会创建更大的平铺RenderedImage
。或者使用具有多个波段(多个阵列)的自定义Raster
。
在任何情况下,您的限制因素都是可用的连续内存。
为了解决这个问题,我创建了一个DataBuffer implementation that uses a memory mapped file来存储JVM堆外部的图像数据。它完全是实验性的,但我已成功创建BufferedImage
s width * height ~= Integer.MAX_VALUE / 4
。性能不是很好,但对于某些应用程序可能是可以接受的。