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.899 ]
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) */
Copia de um arquivo para outro
Escrevendo num arquivo em java
Ordenação crescente e decrescente
Nenhum comentário foi encontrado.
Atenção a quem posta conteúdo de dicas, scripts e tal (6)
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
O mínimo que você precisa saber sobre o terminal (parte 2)
O mínimo que você precisa saber sobre o terminal (parte 1)
Como iniciar uma máquina virtual do VirtualBox automaticamente no boot do LUbuntu 18 LTS
Mudar o gerenciador de login (GDM para SDDM e vice-versa) - parte 2
Como deixar as abas do Firefox mais fininhas
Mudar o gerenciador de login (GDM para SDDM)
"Tentando" fazer com que programas rodem no Wayland e no X11
erro do cinnamon ao instalar no bodhi linux (1)
Marcação de cabeçalho no squid (2)