então colegas, tenho uma duvida gigante, estou fazendo um trabalho da Faculdade tive um divida, estou aplicando filtros em imagens, e o codigo que eu tenho hoje ele so esta aplicando 1 filtro, precisaria substituir o chamada da classe filtro por uma opção de escolha, os codigo estarão abaixo.
import java.awt.*;
import java.awt.image.BufferedImage;
public class Filtro {
//método de aplicação do filtro escala de cinza
//recebe como parâmetro uma imagem
public static BufferedImage escalaDeCinza(BufferedImage imagem) {
//pegar largura e altura da imagem
int width = imagem.getWidth();
int height = imagem.getHeight();
int media = 0;
//laço para varrer a matriz de pixels da imagem
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) { //rgb recebe o valor RGB do pixel em questão
int rgb = imagem.getRGB(i, j);
int r = (int)((rgb&0x00FF0000)>>>16); //R
int g = (int)((rgb&0x0000FF00)>>>8); //G
int b = (int) (rgb&0x000000FF); //B
//media dos valores do RGB
//será o valor do pixel na nova imagem
media = (r + g + b) / 3;
//criar uma instância de Color
Color color = new Color(media, media, media);
//setar o valor do pixel com a nova cor
imagem.setRGB(i, j, color.getRGB());
}
}
return imagem;
}
public static BufferedImage negativo(BufferedImage image) {
int width = image.getWidth();
int height = image.getHeight();
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
int rgb = image.getRGB(i, j); //a cor inversa é dado por 255 menos o valor da cor
int r = 255 - (int)((rgb&0x00FF0000)>>>16);
int g = 255 - (int)((rgb&0x0000FF00)>>>8);
int b = 255 - (int) (rgb&0x000000FF);
Color color = new Color(r, g, b);
image.setRGB(i, j, color.getRGB());
}
}
return image;
}
public static BufferedImage threshold(BufferedImage image, int limiar) {
int width = image.getWidth();
int height = image.getHeight();
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
int rgb = image.getRGB(i, j);
int r = (int)((rgb&0x00FF0000)>>>16);
int g = (int)((rgb&0x0000FF00)>>>8);
int b = (int) (rgb&0x000000FF);
int media = (r + g + b) / 3;
Color white = new Color(255, 255, 255);
Color black = new Color(0, 0, 0);
//como explicado no artigo, no threshold definimos um limiar,
//que é um valor "divisor de águas"
//pixels com valor ABAIXO do limiar viram pixels PRETOS,
//pixels com valor ACIMA do limiar viram pixels BRANCOS
if (media < limiar)
image.setRGB(i, j, black.getRGB());
else
image.setRGB(i, j, white.getRGB());
}
}
return image;
}
}
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.swing.JFileChooser;
import javax.swing.filechooser.FileNameExtensionFilter;
import javax.imageio.ImageIO;
public class App {
public static void main(String[] args) throws IOException {
FileNameExtensionFilter filter = new FileNameExtensionFilter("Imagens", "jpg","png");
JFileChooser choose = new JFileChooser();
File img;
choose.setFileSelectionMode(JFileChooser.FILES_ONLY);
choose.setAcceptAllFileFilterUsed(false);
choose.addChoosableFileFilter(filter);
choose.showOpenDialog(null);
BufferedImage imgfiltered;
img = choose.getSelectedFile();
String dir1 = "";
String dir2 = "";
dir1 = choose.getSelectedFile().getAbsolutePath();
System.out.println(dir1);
try {
//carrega nova imagem
BufferedImage imagem1 = ImageIO.read(img);
//instancia um filtro e aplica a escala de cinza
Filtro.escalaDeCinza(imagem1);
imgfiltered = imagem1;
//gera uma nova imagem a partir da imagem1
choose.showSaveDialog(null);
dir2 = choose.getSelectedFile().getAbsolutePath();
System.out.println(dir2);
ImageIO.write(imagem1,"jpg",new File(dir2));
//aqui apenas para demonstração,
//carreguei novamente a imagen inicial para exibi-la dentro de um JFrame
imagem1 = ImageIO.read(img);
Exibicao.exibirImagem(imagem1, imgfiltered);
System.out.println("Filtro aplicado com sucesso!");
}
catch(IOException e){
System.out.println("Erro! Verifique se o arquivo especificado existe e tente novamente.");
}
catch(Exception e){
System.out.println("Erro! " + e.getMessage());
}
}
}
import java.awt.*;
import java.awt.image.BufferedImage;
import javax.swing.*;
public class Exibicao {
public static void exibirImagem(BufferedImage image) {
ImageIcon icon = new ImageIcon(image);
JLabel imageLabel = new JLabel(icon);
JFrame frame = new JFrame();
Container contentPane = frame.getContentPane();
contentPane.setLayout(new GridLayout());
contentPane.add(new JScrollPane(imageLabel));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(800, 600);
frame.setVisible(true);
}
public static void exibirImagem(BufferedImage image, BufferedImage image2) {
ImageIcon icon = new ImageIcon(image);
JLabel imageLabel = new JLabel(icon);
ImageIcon icon2 = new ImageIcon(image2);
JLabel imageLabel2 = new JLabel(icon2);
JFrame frame = new JFrame();
Container contentPane = frame.getContentPane();
contentPane.setLayout(new GridLayout());
contentPane.add(new JScrollPane(imageLabel));
contentPane.add(new JScrollPane(imageLabel2));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(1100, 680);
frame.setVisible(true);
}
}
No caso eu precisaria substituir o Filtro.escalaDeCinza(imagem1); por uma estrutura de escolha, mas como aplica-la e como coloc-lá entra a JFileChooser para abrir a imagem e para salvar?
Obrigado, Agradecido!