Очистить прозрачный BufferedImage как можно быстрее - PullRequest
10 голосов
/ 03 марта 2010

У меня есть прозрачный BufferedImage, созданный с помощью следующего кода (я думаю, не имеет значения, как он создается):

            GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
            GraphicsDevice gs = ge.getDefaultScreenDevice();
            GraphicsConfiguration gc = gs.getDefaultConfiguration();

            Rectangle screen = transformationContext.getScreen();

            // Create an image that supports transparent pixels
            return gc.createCompatibleImage((int) screen.getWidth(), (int) screen.getHeight(),
                    Transparency.BITMASK);

Как очистить изображение (пустое изображение в том же состоянии, в котором оно было создано) самым быстрым способом без воссоздания изображения? Воссоздание образа обременяет GC, останавливает виртуальную машину и замораживает пользовательский интерфейс.

Ответы [ 2 ]

18 голосов
/ 03 марта 2010

Понял :) использовал clearRect вместо заливки прозрачным цветом.

            graphics = (Graphics2D) offlineBuffer.getGraphics();
            graphics.setBackground(new Color(255, 255, 255, 0));
            Rectangle screen = transformationContext.getScreen();
            graphics.clearRect(0,0, (int)screen.getWidth(), (int)screen.getHeight());
9 голосов
/ 03 марта 2010

Один относительно быстрый способ, но я не знаю, является ли он самым быстрым (и я хотел бы видеть другие ответы), это иметь другую картинку, которую вы никогда не изменяете, и которая всегда «полностью очищается» / «полностью прозрачна». "и затем вы делаете растровую копию, скажем, вы назвали эту копию CLEAR:

imageYouWantToClear.setData( CLEAR.getRaster() );

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

Я думаю, что лучшее место, где можно найти информацию о предмете BufferedImage, было бы в сообществе / форумах Java-программистов и Java-API.

Кстати, убедитесь, что оба ваших BufferedImage используют режим «совместимости»: TYPE_INT_ARGB может подойти для Windows, но не для OS X и т. Д., Поэтому вы хотите создать их, выполнив что-то вроде:

GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getDefaultConfiguration().createCompatibleImage(width, height, Transparency.TRANSLUCENT);

Оу, Закон Ясности болит, спасибо Java;)

...