Problema alteração imagem ( BufferImage ) [RESOLVIDO]

6 respostas
sh3lld3r

Bom dia senhores,

Seguinte, estava tentando ajudar uma amiga aqui no serviço, mas não estou dando conta.

A gente criou um JFrame, que pega uma imagem, e tem 3 botoes, cada um deles, satura a imagem em R, G ou B respectivamente. Beleza, na primeira clicada, funfa, na segunda, o JPanel fica preto.

Eu achando lógico criei 2 buffers de imagem na classe, alterei 1, e qndo fosse fazer a alteração ele pega o buffer intacto e atribuia para o alterado. Mas continuou dando o mesmo problema.

Vou colar o código, alguma sugestão do que deve ser feito? Eu consegui fazendo uma gambiarra, mas eu gostaria de uma maneira menos porca.

A maneira porca, foi definir o FileDialog como global, e reatribuir o jPanel2 a cada clique de botão. Mas tenho certeza que deve haver uma maneira melhor de fazer isso.

Obrigado pela atenção, código abaixo. JFRAME (só coloquei o fundamental)
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
  
        fd.setVisible(true);
        if (fd.getFile() != null) {
            try {
                    ((Imagem) jPanel1).atribuiImagem(ImageIO.read(new File(fd.getDirectory() + fd.getFile())));
                    ((Imagem) jPanel2).atribuiImagem(ImageIO.read(new File(fd.getDirectory() + fd.getFile())));
                    image3 = ImageIO.read(new File(fd.getDirectory() + fd.getFile()));
            } catch (IOException ex) {
                    Logger.getLogger(exucutor.class.getName()).log(Level.SEVERE, null, ex);
}

       private void jButton2ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        ((Imagem) jPanel2).atribuiImagem(image3);
        ((Imagem)jPanel2).escala_red();
        jPanel2.repaint();

    }                                        

    private void jButton3ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        ((Imagem) jPanel2).atribuiImagem(image3);
        ((Imagem)jPanel2).escala_blue();
        jPanel2.repaint();

    }                                        

    private void jButton4ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        ((Imagem) jPanel2).atribuiImagem(image3);
        ((Imagem)jPanel2).escala_green();
         jPanel2.repaint();
    }                                        

    public static void main(String args[]) {
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new exucutor().setVisible(true);
            }
        });
    }

    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private javax.swing.JButton jButton2;
    private javax.swing.JButton jButton3;
    private javax.swing.JButton jButton4;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    // End of variables declaration                   

}
IMAGEM
public class Imagem extends JPanel{
    private BufferedImage figura, figura2;

    public Imagem () {
            super();
    }

    @Override
    protected void paintComponent (Graphics g) {
        super.paintComponents(g);
        g.drawImage(figura, 0, 0, null);
        
    }
    
    public void atribuiImagem (BufferedImage _buffer) {
        figura = _buffer;
        figura2 = _buffer;
        repaint();
    }
      
    public void escala_red() {

        figura = figura2;
        int x, y, r, cinza;
        for (x=0; x<figura.getWidth(); x++)
            for (y=0; y<figura.getHeight(); y++) {
                Color color = new Color (figura.getRGB(x, y));
                r = (int) color.getRed();

                figura.setRGB(x, y, (new Color (r, 0, 0).getRGB()));
            }
        
    }
    
    public void escala_green() {

        figura = figura2;
        int x, y, g;
        for (x=0; x<figura.getWidth(); x++)
            for (y=0; y<figura.getHeight(); y++) {
                Color color = new Color (figura.getRGB(x, y));
                g = (int) color.getGreen();
                figura.setRGB(x, y, (new Color (0, g, 0).getRGB()));
            }
        
    }
    
    public void escala_blue() {

        figura = figura2;
        int x, y, b;
        for (x=0; x<figura.getWidth(); x++)
            for (y=0; y<figura.getHeight(); y++) {
                Color color = new Color (figura.getRGB(x, y));
                b = (int) color.getBlue();
                figura.setRGB(x, y, (new Color (0, 0, b).getRGB()));
            }
        
 }

6 Respostas

sh3lld3r

as vezes eu me sinto totalmente desamparado nesse forum :lol:

Estou teimando aqui e até agora não obtive nenhuma melhoria, tentei até refazer algumas coisas.

danieldestro

Caro, alterei parte do nome do título deste post, pois tinha palavra não relacionada com o problema em si.
Grato

ViniGodoy

Desculpe a demora. É isso que você quer?

Note que a fórmula que está usando não satura nada. Na verdade, ela isola o canal de cor especificado. Se sua imagem não contiver uma das cores componentes, ela ficará mesmo preta naquela cor.

Seu código estava muito ruim, por isso refiz tudo do zero. Evite abusar da herança.
Seria legal também separar a operação de cor em uma classe diferente, ao invés de usar diretamente na janela, como eu fiz.

ViniGodoy

Ah, quase que em esqueço. Ao invés de tentar escrever o efeito no braço, manualmente, tente usar essa biblioteca aqui:
http://www.jhlabs.com/ip/filters/index.html

Além de muito mais fácil, ela já é preparada para lidar com diversos formatos de imagem.

O seu algoritmo, usado no meu exemplo anterior, implicitamente converte qualquer formato para RGB. O que significa que informações no canal de transparência também são transformadas em preto.

sh3lld3r

Muito obrigado Vini

heheh concordo que o código está muito ruim, ele não foi bem feito por mim, uma amiga aqui do serviço precisava de uma ajuda com um problema da faculdade dela, mas apanhei tanto que acho que vou acabar aprendendo algo com tudo isso ehhe :slight_smile:

Vou estudar seu código aqui, e tentar explicar para ela :slight_smile:

Muito obrigado mais uma vez pela ajuda, e desculpe a choradeira :wink: foi pq achei que este topico iria morrer, como um outro que fiz a algum tempo.

sh3lld3r

A propósito, seu código é lindo rapaz. :slight_smile: Só para constar mesmo.

Eu vou ter que dar uma boa estudada pra entender alguma coisa, antes de passar pra ela hehehe XD Mas entendi +/-

Vlw mesmo :slight_smile: acredito que o problema esteja em parte resolvido.

Criado 6 de março de 2009
Ultima resposta 6 de mar. de 2009
Respostas 6
Participantes 3