ImagemFacil 1.0, um editor de imagens recheado de recursos
Publicado por Talvanes Ferreira de Sousa (última atualização em 07/06/2011)
[ Hits: 8.280 ]
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)
*/
Ordenação crescente e decrescente
Ler arquivo e remover Strings duplicadas
Nenhum comentário foi encontrado.
Modo Simples de Baixar e Usar o bash-completion
Monitorando o Preço do Bitcoin ou sua Cripto Favorita em Tempo Real com um Widget Flutuante
Instalando partes faltantes do Plasma 6
Adicionar botão "mostrar área de trabalho" no Zorin OS
Como montar um servidor de backup no linux
Estou tentando ser legalista, mas tá complicado! (9)
espelhar monitores nao funciona (2)
SQLITE não quer funcionar no LINUX LMDE6 64 com Lazaruz 4.2 64bit (n... (1)









