ImagemFacil 1.0, um editor de imagens recheado de recursos

Publicado por Talvanes Ferreira de Sousa (última atualização em 07/06/2011)

[ Hits: 7.928 ]

Download ImagemFacil.java




Conheçam o ImagemFacil 1.0, um editor de imagens totalmente escrito em Java Swing, usando a máquina virtual OpenJDK6.0, uma implementação livre da plataforma Java oficial da Sun/Oracle. Ele foi desenvolvido como um trabalho de faculdade na disciplina de Processamento de Imagens e Computação Gráfica do curso de Engenharia da Computação. O ambiente de desenvolvimento utilizado foi o Eclipse, versão Helios.

  



Esconder código-fonte

/**
    IMAGEM FACIL (ImagemFacil.java) - Esqueleto da janela do programa
*/
package imagemfacil;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.image.BufferedImage;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.imageio.ImageIO;
import javax.swing.Box;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JCheckBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JToolBar;

/**
 * @author talba
 *
 */
public class ImagemFacil extends JFrame{
   private BufferedImage imagemEntrada, imagemSaida, imagemTrans;
   private JToolBar brTransforma;
   private JPanel pnlImagens, pnlBotoesAlfaCinza, pnlBotoes;
   private JLabel lblImgEntrada, lblImgSaida;
   private JButton btnCarregar, btnRecarregar, btnSalvar;
   private JButton btnSetAlpha, btnTonsDeCinza, btnNegativo;
   private JButton btnRotEsq, btnRotDir, btnEspVert, btnEspHoriz;
   private JScrollPane pnlImgEntrada, pnlImgSaida;
   private JCheckBox chkRed, chkGreen, chkBlue;
   
   /**
    * Construtor da classe ImagemFacil
    */
   public ImagemFacil(){
      this.initComponents();
   }

   /**
    * Inicializa os componentes gráficos 
    */
   private void initComponents() {
      // construir botões e itens gráficos
      this.setTitle("ImagemFacil 1.0");
      this.setDefaultCloseOperation(EXIT_ON_CLOSE);
      
      //criação do painel e dos subpaineis das imagens
      this.lblImgEntrada = new JLabel();
      this.lblImgSaida = new JLabel();
      this.pnlImgEntrada = new JScrollPane();
      this.pnlImgEntrada.setViewportView(this.lblImgEntrada);
      this.pnlImgSaida = new JScrollPane();
      this.pnlImgSaida.setViewportView(this.lblImgSaida);
      this.pnlImagens = new JPanel();
      this.pnlImagens.setLayout(new GridLayout(1, 2));
      this.pnlImagens.add(this.pnlImgEntrada);
      this.pnlImagens.add(this.pnlImgSaida);
      
      // caixas de transformação: tons de cinza e canais alfa RGB (red, green, blue)
      this.chkRed = new JCheckBox("Vermelho");
      this.chkRed.addItemListener(new ItemListener() {
         @Override
         public void itemStateChanged(ItemEvent e) {
            // canal RGB RED
            
         }
      });
      this.chkGreen = new JCheckBox("Verde");
      this.chkBlue = new JCheckBox("Azul");
      this.btnSetAlpha = new JButton(new ImageIcon("./imagens/view-refresh.png"));
      this.btnSetAlpha.addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
            // canais alfa RGB
            int altura = imagemTrans.getHeight();
            int largura = imagemTrans.getWidth();
            int cor[] = new int[3];
            imagemSaida = new BufferedImage(largura, altura, BufferedImage.TYPE_INT_RGB);
            for(int y=0; y < altura; y++){
               for(int x=0; x < largura; x++){
                  imagemTrans.getRaster().getPixel(x, y, cor);
                  if(!chkRed.isSelected()){
                     cor[0]=0;
                  }
                  if(!chkGreen.isSelected()){
                     cor[1]=0;
                  }
                  if(!chkBlue.isSelected()){
                     cor[2]=0;
                  }
                  imagemSaida.getRaster().setPixel(x, y, cor);
               }
            }
            imagemTrans = imagemSaida;
            ImageIcon i = new ImageIcon(imagemSaida);
            lblImgSaida.setIcon(i);            
         }
      });
      this.btnTonsDeCinza = new JButton("Tons de cinza");
      this.btnTonsDeCinza.setSize(50, 30);
      this.btnTonsDeCinza.addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
            // Tons de cinza para a imagem
            int altura = imagemTrans.getHeight();
            int largura = imagemTrans.getWidth();
            int cor[] = new int[3]; // canais RGB (RED, GREEN, BLUE)
            imagemSaida = new BufferedImage(largura, altura, BufferedImage.TYPE_INT_RGB);
            for (int y = 0; y < altura; y++) {
               for (int x = 0; x < largura; x++) {
                  imagemTrans.getRaster().getPixel(x, y, cor);
                  int grey = (cor[0] + cor[1] + cor[2]) / 3;
                  cor[2] = cor[1] = cor[0] = grey;
                  imagemSaida.getRaster().setPixel(x, y, cor);
               }
            }
            imagemTrans = imagemSaida;
            ImageIcon i = new ImageIcon(imagemSaida);
            lblImgSaida.setIcon(i);
         }
      });
      this.btnNegativo = new JButton("Negativo");
      this.btnNegativo.addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
            // filtro negativo
            int altura = imagemTrans.getHeight();
            int largura = imagemTrans.getWidth();
            int cor[] = new int[3]; // canais RGB (RED, GREEN, BLUE)
            imagemSaida = new BufferedImage(largura, altura, BufferedImage.TYPE_INT_RGB);
            for (int y = 0; y < altura; y++) {
               for (int x = 0; x < largura; x++) {
                  imagemTrans.getRaster().getPixel(x, y, cor);
                  cor[0]=255-cor[0];
                  cor[1]=255-cor[1];
                  cor[2]=255-cor[2];
                  imagemSaida.getRaster().setPixel(x, y, cor);
               }
            }
            imagemTrans = imagemSaida;
            ImageIcon i = new ImageIcon(imagemSaida);
            lblImgSaida.setIcon(i);
         }
      });
      //botão para transformações RGB
      this.pnlBotoesAlfaCinza = new JPanel();
      this.pnlBotoesAlfaCinza.setLayout(new FlowLayout(FlowLayout.LEFT));
      this.pnlBotoesAlfaCinza.add(this.btnTonsDeCinza);
      this.pnlBotoesAlfaCinza.add(this.btnNegativo);
      this.pnlBotoesAlfaCinza.add(Box.createRigidArea(new Dimension(25, 0)));
      this.pnlBotoesAlfaCinza.add(this.chkRed);
      this.pnlBotoesAlfaCinza.add(this.chkGreen);
      this.pnlBotoesAlfaCinza.add(this.chkBlue);
      this.pnlBotoesAlfaCinza.add(Box.createRigidArea(new Dimension(5, 0)));
      this.pnlBotoesAlfaCinza.add(this.btnSetAlpha);
      
      // barra vertical - botoes de transformação (rotação e espelhamento)
      brTransforma = new JToolBar(JToolBar.VERTICAL);
      brTransforma.setFloatable(true);
      this.btnRotEsq = new JButton(new ImageIcon("./imagens/object-rotate-left.png"));
      this.btnRotEsq.setToolTipText("Rotaciona 90° à esquerda");
      this.btnRotEsq.addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
            // Algoritmo de rotação à esquerda
            int altura = imagemTrans.getHeight();
            int largura = imagemTrans.getWidth();
            int cor[] = new int[3];
            imagemSaida = new BufferedImage(altura, largura, BufferedImage.TYPE_INT_RGB);
            for(int ye=0, x=0; x < altura; x++, ye++){
               for(int y=largura-1, xe=0; y>=0; y--, xe++){
                  imagemTrans.getRaster().getPixel(xe, ye, cor);
                  imagemSaida.getRaster().setPixel(x, y, cor);
               }
            }
            imagemTrans = imagemSaida;
            ImageIcon i = new ImageIcon(imagemSaida);
            lblImgSaida.setIcon(i);
         }
      });
      brTransforma.add(this.btnRotEsq);
      this.btnRotDir = new JButton(new ImageIcon("./imagens/object-rotate-right.png"));
      this.btnRotDir.setToolTipText("Rotaciona 90° à direita");
      this.btnRotDir.addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
            // Algoritmo de rotação à direita
            int altura = imagemTrans.getHeight();
            int largura = imagemTrans.getWidth();
            int cor[] = new int[3];
            imagemSaida = new BufferedImage(altura, largura, BufferedImage.TYPE_INT_RGB);
            for(int ye=0, x=altura-1; x>=0; x--, ye++){
               for(int xe=0, y=0; y < largura; y++, xe++){
                  imagemTrans.getRaster().getPixel(xe, ye, cor);
                  imagemSaida.getRaster().setPixel(x, y, cor);
               }
            }
            imagemTrans = imagemSaida;
            ImageIcon i = new ImageIcon(imagemSaida);
            lblImgSaida.setIcon(i);
         }
      });
      brTransforma.add(this.btnRotDir);
      this.btnEspHoriz = new JButton(new ImageIcon("./imagens/object-flip-horizontal.png"));
      this.btnEspHoriz.setToolTipText("Espelhamento horizontal");
      this.btnEspHoriz.addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
            // Algoritmo de espelhamento horizontal
            int altura = imagemTrans.getHeight();
            int largura = imagemTrans.getWidth();
            int cor[] = new int[3];
            imagemSaida = new BufferedImage(largura, altura, BufferedImage.TYPE_INT_RGB);
            for(int y=0, ye=0; y < altura; y++, ye++){
               for(int x=largura-1, xe=0; x>=0; x--, xe++){
                  imagemTrans.getRaster().getPixel(xe, ye, cor);
                  imagemSaida.getRaster().setPixel(x, y, cor);
               }
            }
            imagemTrans = imagemSaida;
            ImageIcon i = new ImageIcon(imagemSaida);
            lblImgSaida.setIcon(i);
         }
      });
      brTransforma.add(this.btnEspHoriz);
      this.btnEspVert = new JButton(new ImageIcon("./imagens/object-flip-vertical.png"));
      this.btnEspVert.setToolTipText("Espelhamento vertical");
      this.btnEspVert.addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
            // Algoritmo de espelhamento vertical
            int altura = imagemTrans.getHeight();
            int largura = imagemTrans.getWidth();
            int cor[] = new int[3];
            imagemSaida = new BufferedImage(largura, altura, BufferedImage.TYPE_INT_RGB);
            for(int y=altura-1, ye=0; y>=0; y--, ye++){
               for(int x=0, xe=0; x < largura; x++, xe++){
                  imagemTrans.getRaster().getPixel(xe, ye, cor);
                  imagemSaida.getRaster().setPixel(x, y, cor);
               }
            }
            imagemTrans = imagemSaida;
            ImageIcon i = new ImageIcon(imagemSaida);
            lblImgSaida.setIcon(i);
         }
      });
      brTransforma.add(this.btnEspVert);
      
      // botões de função: abrir, recarregar e salvar
      this.btnCarregar = new JButton("Carregar");
      this.btnCarregar.setSize(new Dimension(50, 30));
      this.btnCarregar.addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent e) {
            // Carrega arquivo de imagem
            JFileChooser seletor = new JFileChooser();
            int resposta = seletor.showOpenDialog(pnlBotoes);
            try{
               if (resposta == 0){
                  imagemEntrada = ImageIO.read(seletor.getSelectedFile());
                  ImageIcon ie = new ImageIcon(imagemEntrada);
                  lblImgEntrada.setIcon(ie);
                  imagemTrans = imagemEntrada;
               }
            }catch(Exception ex){
               JOptionPane.showMessageDialog(null, "Impossível carregar imagem " + seletor.getSelectedFile().getAbsolutePath());
            }
         }
      });
      this.btnSalvar = new JButton("Salvar");
      this.btnSalvar.addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent arg0) {
            // Salva a imagem editada
            
         }
      });
      this.btnRecarregar = new JButton("Desfazer formatação");
      this.btnRecarregar.addActionListener(new ActionListener() {
         @Override
         public void actionPerformed(ActionEvent arg0) {
            // reinicia as imagens para como foram anteriormente
            imagemSaida = imagemTrans = imagemEntrada;
            ImageIcon i = new ImageIcon(imagemSaida);
            lblImgSaida.setIcon(i);
         }
      });
      this.pnlBotoes = new JPanel(new FlowLayout(FlowLayout.TRAILING));
      this.pnlBotoes.add(this.btnCarregar);
      this.pnlBotoes.add(Box.createRigidArea(new Dimension(5, 0)));
      this.pnlBotoes.add(this.btnSalvar);
      this.pnlBotoes.add(Box.createRigidArea(new Dimension(40, 0)));
      this.pnlBotoes.add(this.btnRecarregar);
      
      //layout final
      this.getContentPane().setLayout(new BorderLayout());
      this.getContentPane().add(this.pnlImagens, BorderLayout.CENTER);
      this.getContentPane().add(this.pnlBotoesAlfaCinza, BorderLayout.NORTH);
      this.getContentPane().add(this.brTransforma, BorderLayout.EAST);
      this.getContentPane().add(this.pnlBotoes, BorderLayout.SOUTH);
      
      this.setLocationRelativeTo(null);
      this.pack();
      // fim de itens gráficos
   }
   
}
/**
    FIM DO IMAGEM FACIL (ImagemFacil.java)
*/

/**
    IMAGEM FACIL (Main.java) - O código principal, responsável por exibir a janela gráfica
*/
import imagemfacil.ImagemFacil;

public class Main {

   /**
    * @param args
    */
   public static void main(String[] args) {
      // TODO Auto-generated method stub
      ImagemFacil frame = new ImagemFacil();
      frame.setVisible(true);
   }

}
/**
    FIM DO IMAGEM FACIL (Main.java)
*/

Scripts recomendados

Microssistema de controle de compras

Copia de um arquivo para outro

Utilizando a classe File

Ordenação crescente e decrescente

Ler arquivo e remover Strings duplicadas


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts