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.762 ]

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

Ler arquivo e remover Strings duplicadas

Classe java para converter jTableModel em HTML / Open Office/Libre Office/Excel (todos)

Ordenação crescente e decrescente

Escrevendo num arquivo em java

Grava linhas de um arquivo


  

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