In my opinion, an efficient way of doing this in java2D/windows is using the drawImage with a LookupOp operation
LookupOp LU;
…
g.drawImage(image,LU,posX,posY);
by modifying the LookupOp you can change the image brightness:
e.g. Darken image, half of the brightness:
brightnessBloq=new byte[256];
for(int i=0;i<256;i++){brightnessBloq[i]=(byte)(i/2);
LU = new LookupOp( new ByteLookupTable(0,brightnessBloq), null);
later, by just modifying values of brightnessBloq array, it automatically change the brigtness fo the next painted image.
Also, I agree that if you want good performance with high resolutions, java2D can be a little bit problematic 
BR