Java - добавление отступов к большим изображениям - PullRequest
2 голосов
/ 24 июня 2011

Мне нужно добавить специальные отступы вокруг больших изображений, и текущий метод, который я использую, как видно из фрагмента ниже, потребляет память. Открытие PNG высасывает ~ 300 Мб памяти сразу, а создание копии этого проталкивает меня дальше 700 Мб, поэтому я ищу способ сделать это, не занимая всю доступную память. Есть предложения?

...
BufferedImage img = ImageIO.read(new File("OldWorld.png"));
BufferedImage img2 = new BufferedImage(img.getHeight()+padding,img.getWidth()+padding, BufferedImage.TYPE_INT_ARGB);
Graphics2D g2 = img2.createGraphics();
g2.setPaint(new Color(0,0,0,0);
g2.fillRect(0, 0, img.getHeight()+padding, img.getWidth()+padding);
g2.drawImage(img, img.getHeight(),img.getWidth(), null);
...

1 Ответ

1 голос
/ 03 сентября 2011

Нет прямого способа решить это.Работа с большими изображениями в Java занимает много памяти.

Некоторые альтернативы:

  1. Предварительная обработка изображений с помощью библиотеки netpbm http://netpbm.sourceforge.net/. ДляДля дополнения изображения используйте команду типа:

    pngtopnm OldWorld.png | pnmpad -black 48 -left 48 -top 48 | pnmtopng > padded.png
    
  2. Уменьшите количество цветов в вашем изображении, чтобы вы могли использовать тип изображения BufferedImage.TYPE_INDEXED, используя только один байт на пиксель вместо четырех.

  3. Используйте несколько плиток вместо одного большого изображения и работайте с одной плиткой за раз.Тогда вы избежите большого количества данных изображения в памяти.

...