Efeito com várias imagens

Boa tarde!

Estou fazendo um efeito com luzes coloridas e como já visto em outros tópicos, estou usando várias imagens para dar esse efeito. Estou com dois problemas:

Preciso de um método para carregar mais fácil todas essas imagens e jogar dentro de uma variável, por exemplo, tenho 5 imagens já carregadas e quero que uma seja pintada, então jogo essa na variavel (uma apenas) para pintar essa imagem;

Essa imagem precisa ter sua transparencia ajustada, será que existe um método que modifique a transparencia somente desta imagem?

Agradeço a ajuda,

Abraço,

Marcelo.

Olá.
Para ajustar a transparência da pintura, vc pode utilizar o método setComposite de Graphics2D. Por Exemplo:

Graphics2D g2 = (Graphics2D) g;
g2.setComposite(
    AlphaComposite.DstOver.derive(0.5f));//Para 50% de transparência.
g2.drawImage(img, 0, 0, null);

O problema que este método clareia toda a tela, inclusive as outras imagens que compõe o fundo. Como fazer para clarear somente a imagem que eu quero?

Desculpe, onde está DstOver:

g2.setComposite(  
    AlphaComposite.DstOver.derive(0.5f));//Para 50% de transparência. 

Na verdade era pra ser SrcOver:

g2.setComposite(  
    AlphaComposite.SrcOver.derive(0.5f));//Para 50% de transparência. 

Assim funciona, acabei de testar:

import java.awt.*;
import javax.swing.*;


public class CompositePanel extends JPanel {

    private java.util.List<Image> imgs;
 

    public CompositePanel() {
      imgs = new java.util.LinkedList<Image>();
    }


    public CompositePanel(Image ... images) {
      this();
      for(Image img : images)
        imgs.add(img);
    }


    public java.util.List<Image> getImagesList() {
      return imgs;
    }


    protected void paintComponent(Graphics g) {
      Graphics2D g2 = (Graphics2D) g.create();
      int x = 1, y = 1, w = this.getWidth()-2, h = this.getHeight()-2;
      int inc = 50;
      float alpha = 1.0f;
      float dec = 0.28f;

      AlphaComposite comp = AlphaComposite.SrcOver.derive(alpha);
      g2.setComposite(comp);

      for(Image img : imgs) {
        System.out.println("bounds: " + x + ", " + y + 
            ", " + (w-x) + ", " + (h-y));
        System.out.println("alpha : "+ alpha);
        g2.drawImage(img, x, y, w - x, h - y, null);
        x += inc;
        y += inc;
        if(x > (w-inc)) x = w-inc;
        if(y > (h-inc)) y = h-inc;
        alpha -= dec;
        if(alpha < 0) alpha = 0;
        g2.setComposite(comp.derive(alpha));
      }//for

      g2.dispose();
    }//paintComponent()
    
    
    public static void loadImages(CompositePanel cp) {
      Toolkit tk = Toolkit.getDefaultToolkit();
      String base = "images/image", ext = ".jpg";
      MediaTracker mt = new MediaTracker(cp);

      for(int i = 0; i < 4; i++) {
        Image im = tk.createImage(base+i+ext);
        mt.addImage(im, i);
        System.out.println(base+i+ext);
        cp.getImagesList().add(im);
      }//for

      try {

        mt.waitForAll();

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

    }//loadImages()


    public static void main(String[] args) {
      JFrame f = new JFrame("CompositePanel");
      f.setBounds(200, 200, 307, 332);
      f.setLayout(null);
      f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      
      CompositePanel cp = new CompositePanel();
      loadImages(cp);
      cp.setBounds(2, 2, 295, 295);
      cp.setBorder(BorderFactory.createLineBorder(Color.BLUE));
      f.add(cp);
      f.setVisible(true);
    }//main()

}//class

Olá!

Vou testar o método e depois posto aqui.

Obrigado!

Marcelo.

Bem legal este método!

Vou estudar esta parte de carregar diversas imagens, para poder escolher na hora apropriada qual usar. Para ajustar a transparencia precisaria de um dispositivo. Sobre este método, como falei, ele deixa toda a tela transparente. Estava pensando em criar uma classe que chamasse esta, pintando assim esta classe com a transparencia escolhida. Vou tentar isso.

Muito obrigado pela ajuda!

Marcelo.

Olá!

Estou com algumas dúvidas para resolver um problema. No caso eu quero já ter diversas imagens carregadas e em dado momento pintar uma delas e clarear; tudo com um dispositivo. Como poderia fazer neste caso?

Abraço,

Marcelo.

Ow, como faz pra essa classe alterar uma imagem só? Ou virar um método que eu possa aplicar só de vez em qdo?

Olá!

No meu caso resolvi o problema da seguinte forma:

Criei este método em uma classe, onde ele clareia a imagem escolhida. Em uma classe principal que contem o método paint, eu “chamo” esta classe. Exemplo:

Supondo que a classe que contem o método da imagem clareada seja Imagem, na classe principal faça:

E no método paint:


 public void paintComponent(Graphics g) {      
           	  
         	Graphics2D g2d = (Graphics2D)g.create();          		
 		           	   	     
        	          	     
        	imagem.draw(g2d);
         	}

E se quiser mudar a imagem, faça um dispositivo para alterar a imagem em Imagem e use repaint().

Espero ter ajudado.

Abraço,

Marcelo.

Mas vc criou qual método? ‘-’ De que jeito? o.o"