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.232 ]
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
Ordenação crescente e decrescente
Nenhum comentário foi encontrado.
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Como instalar o repositório do DBeaver no Ubuntu
Como instalar o Plex Media Server no Ubuntu
Digitando underscore com "shift" + "barra de espaços"
Como ativar a lixeira e recuperar aquivos deletados em um servidor Linux
Como mudar o nome de dispositivos Bluetooth via linha de comando
Como posso remover arquivos MSG duplicados das minhas pastas de forma ... (0)
Assinador JNLP do Site Portal da Nota Fiscal Eletrônica (4)









