You can not get the pixels from a graphics object. That is why it is slow. If you could, you could do all sorts of cool effects. I have to create a buffered Image and to draw to and to perform the filter on. But this is sped up a bunch by using a VolatileImage and drawing with its graphics object then using the getSnapShot() method to draw onto a scaled down bufferedImage which is then filtered. I get reasonable performance with this.
Graphics2D g2d = (Graphics2D) bufferstrat.getDrawGraphics();
g2d.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
v = this.createVolatileImage(render.getWidth(), render.getHeight());
b = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice()
.getDefaultConfiguration().createCompatibleImage(render.getWidth()/scale, render.getHeight()/scale);
b.setAccelerationPriority(1);
v.getGraphics().fillRect(0, 0, v.getWidth(),v.getHeight());
renderGame(v.getGraphics());
b.getGraphics().drawImage(v.getSnapshot(),0,0,render.getWidth()/scale,render.getHeight()/scale,null);
b = bloom.filter(b, b);
g2d.drawImage(b,0,0,render.getWidth(),render.getHeight(),null);
for(int j = 0; j <= powers.size() - 1;j++){
powers.get(j).render(g2d);
}
g2d.dispose();
If there was some way of getting pixels in a different way I am more then interested.