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.969 ]
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.
/** 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) */
Ler arquivo e remover Strings duplicadas
Copia de um arquivo para outro
Nenhum comentário foi encontrado.
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Meu Fork do Plugin de Integração do CVS para o KDevelop
Compartilhando a tela do Computador no Celular via Deskreen
Como Configurar um Túnel SSH Reverso para Acessar Sua Máquina Local a Partir de uma Máquina Remota
Configuração para desligamento automatizado de Computadores em um Ambiente Comercial
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Cups: Mapear/listar todas as impressoras de outro Servidor CUPS de forma rápida e fácil
Criando uma VPC na AWS via CLI
A area de trabalho ficou preta (14)
Falta pacotes de suporte ao sistema de arquivos (Gerenciador de discos... (4)
xubuntu sem sons de eventos (4)