Как я могу создать аппаратно ускоренное изображение с Java2D?

Я пытаюсь создать быстрый генератор изображения, который делает много 2-х преобразований и рендеринга формы, таким образом, я пытаюсь использовать BufferedImage и затем получить объект Graphics2D выполнить весь мой рисунок. Мое основное беспокойство теперь состоит в том, чтобы сделать, действительно быстро, таким образом, я создаю BufferedImage как это:

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsConfiguration gc = ge.getDefaultScreenDevice().getDefaultConfiguration();
BufferedImage bImage = gc.createCompatibleImage(width, height, Transparency.TRANSLUCENT);
Graphics2D graphics = bImage.createGraphics();

Однако, если я делаю:

System.out.println(bImage.getCapabilities(gc).isAccelerated());

Вывод всегда является ложью, даже если я запускаю JVM с-Dsun.java2d.opengl=True, который печатает строку:

OpenGL pipeline enabled for default config on screen 0

Я делаю BufferedImage, потому что в конце я хочу сохранить его в файл PNG с ImageIO.write (bImage, "PNG", файл);

Я могу создать VolatileImage, который заявит, что ускоряется, но ImageIO не нравится он при попытке сохранить, высказывании, что то изображение не может быть литым к RenderedImage. Какие-либо идеи о том, как получить ускоренное изображение, которое может быть сохранено к диску? Также я не хочу создавать VolatileImage и копию к BufferedImage для сохранения, так как мои изображения являются действительно большими, и я столкнусь из проблем памяти...

10
задан Michael Myers 3 March 2010 в 19:37
поделиться

3 ответа

Из моего исследования и чтения учебника Sun / Oracle 2D я обнаружил следующее:

Для создания ускоренного изображения можно использовать изменчивое изображение, которое создается как pbuffer. Есть преимущества и недостатки. VolatileImages работают быстро, пока вы не попытаетесь получить данные растровых пикселей. В этот момент они становятся обычным bufferedImage. Кроме того, они изменчивы, и нет гарантии, что они будут доступны в конце вашего рендеринга. Для этого вы выполняете:

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsConfiguration gc = ge.getDefaultScreenDevice().getDefaultConfiguration();
VolatileImage vImage = gc.createCompatibleVolatileImage(width, height, Transparency.TRANSLUCENT);

Это даст вам ускоренное изображение, однако невозможно использовать ImageIO, чтобы записать его напрямую, чтобы сказать файл PNG.

Чтобы использовать обычный BufferedImage, вам нужно сделать что-то вроде:

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsConfiguration gc = ge.getDefaultScreenDevice().getDefaultConfiguration();
BufferedImage img = gc.createCompatibleImage(width, height, Transparency.TRANSLUCENT);
img.setAccelerationPriority(1);

Это создает BufferedImage, который не ускоряется, но вы даете подсказку JVM, которая должна быть, передавая 1 в setAccelerationPriority. Это вы можете прочитать в 2D-следе Учебного пособия по Java .

4
ответ дан 4 December 2019 в 03:38
поделиться

Попробуйте добавить это в ваша командная строка:

-Dsun.java2d.accthreshold=0

РЕДАКТИРОВАТЬ

Я прочитал об этом после того, как вы сказали, что вышеперечисленное не работает. Попробуйте изменить True в параметре OpenGL на строчные буквы.

-Dsun.java2d.opengl=true
1
ответ дан 4 December 2019 в 03:38
поделиться

Вот как это работает:

Способ создания изображения правильный. Но Java не ускоряет изображение сразу. Существует порог вызовов рендеринга, которые должны быть направлены на ваше изображение, после чего изображение будет ускорено. Но если вы установите следующее,

-Dsun.java2d.accthreshold=0

ваше изображение будет ускорено в момент его создания.

Возможно, вам все же придется как-то использовать изображение, чтобы оно стало ускоренным. Например, у меня есть следующий фрагмент кода, который используется для копирования загруженного изображения (загрузка через ImageIO даст вам изображение, которое не может быть ускорено) в мой новый BufferedImage.

Graphics2D g2d = bufferedImage.createGraphics();
g2d.drawImage(image,0,0,null);
g2d.dispose();

До этого участка кода BufferedImage не ускоряется, после - ускоряется.

Но учтите, если вы будете работать с данными изображения напрямую (т.е. не через Java-2d), ваше изображение больше не будет кэшироваться в VRAM, и вам придется скопировать его в новый управляемый образ, чтобы восстановить ускорение.

0
ответ дан 4 December 2019 в 03:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: