2015-05-01 2 views
0

Я ищу более быстрый способ создания больших (12291x12291) BufferedImages. Я использую Graphics2D g2d = image.createGraphics() для рисования на нем, сохранения его в файл, затем с помощью g.drawImage (image, 0, 0, null); для его загрузки. Я сохраняю файл, чтобы позже загрузить определенный образ. На данный момент для создания изображения требуется около 45 секунд до одной минуты. Есть ли способ создать эти изображения быстрее?Ускоренный способ создания больших BufferedImages

Я создаю два из этих изображений.

public void drawTiles() {  
    Graphics2D g2d = tiles1.createGraphics(); 

    left = 0; 
    top = 0; 
    //The drawing takes around 10 to 20 seconds 
    Colors c = new Colors(); 
    for (double[] row : data) { 
     for (double d : row) { 
      int v = (int) (20 - d/500); 
      if (v < 0) { 
       v = 0; 
      } else if (v > 20) { 
       v = 20; 
      } 
      color = v; 
      g2d.setColor(c.colors[color]); 

      g2d.fillRect(left, top, sizeX, sizeY); 
      left += sizeX; 
      if (left == size * sizeX) { 
       left = 0; 
       top += sizeY; 

      } 
     } 
    }  
    g2d.dispose(); 

    //The creation of the file takes little time for an image of this size 
    try { 
     File tiles1file = new File("path/to/map" + id + ".bmp"); 
     ImageIO.write(tiles1, "bmp", tiles1file); 

    } catch (Exception ex) { 
     ex.printStackTrace(); 
    } 

    id++; 
} 
+0

Вы уверены, что «создание образа» является частью принимая долго время? Не могли бы вы показать свой код? –

+1

Сжатие и распаковка PNG (который использует DEFLATE) не так быстро по сравнению с созданием изображения с нуля полностью в памяти. – Nayuki

+0

Однако, как насчет файлов BMP? Они несжаты и в основном ограничены скоростью диска (~ 100 МБ/с). Ваше изображение 12291 × 12291 займет около 450 МБ. – Nayuki

ответ

1

Я бы переехал Colors c = new Colors(); вне всех петель. Создание и сбор мусора, что каждый объект замедляет работу, по крайней мере до тех пор, пока JIT не выяснит, что его можно оптимизировать.

Поскольку доступ к диску происходит гораздо медленнее, чем вычисления, вы можете попытаться максимизировать сжатие PNG, установив качество нулю:

try (ImageOutputStream out = ImageIO.createImageOutputStream(tiles1file)) { 
    ImageWriter writer = ImageIO.getImageWritersByFormatName("png").next(); 
    writer.setOutput(out); 

    ImageWriteParam param = writer.getDefaultWriteParam(); 
    param.setCompressionMode(ImageWriteParam.MODE_EXPLICIT); 
    param.setCompressionQuality(0); 

    writer.write(null, new IIOImage(tiles1, null, null), param); 
} 
Смежные вопросы