2013-08-27 3 views
1

Каков максимальный размер изображения, который можно создать с помощью Java 2D?Как создать изображение большего размера в Java2D

Я использую 64-разрядную ОС Windows 7 Pro и версию JDK 1.6.0_33, 64-разрядную версию. Я могу создать BufferedImage размером до 5 МБ. Кроме того, я получаю 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

Сколько памяти вы даете своей Java-программе? – Kayaman

+0

Привет, Kayaman, я попробовал следующее: java -jar MaxMemoryTest.jar, а также java -jar -Xms512m -Xmx1024m MaxMemoryTest.jar – Sivagururaja

+0

Ваше изображение размером 9050 x 9050 использует 4 байта на пиксель (для TYPE_INT_RGB). Это приводит к 327610000 байтам или> 312 МБ в памяти. Вы уверены в ограничении 5 МБ? Это должно быть выполнимо с -Xmx1024m, если, конечно, входное изображение не огромно. Также помните, что JVM нужен блок * смежного свободного пространства * для создания массива int для вашего изображения в куче. Таким образом, наличие 1024 МБ кучи не является гарантией (но оно должно * работать). – haraldK

ответ

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 s с несколькими полосами (несколько массивов).

В любом случае ваш ограничивающий фактор будет доступен для непрерывной памяти.

Чтобы преодолеть это, я создал DataBuffer implementation that uses a memory mapped file для хранения данных изображения вне кучи JVM. Это полностью экспериментально, но я успешно создал BufferedImage с, где width * height ~= Integer.MAX_VALUE/4. Производительность невелика, но может быть приемлемой для некоторых приложений.

+0

Спасибо за ваш ответ Харальд. Я не работал с растрами и RenderedImage, и все, что я знаю, это BufferedImage. Я должен обновить себя на этом. – Sivagururaja

Смежные вопросы