2
respostas

Processamento de imagem com Java

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!

2 respostas

Você quer que as opções da estrutura de escolha venha de onde? Estrutura de escolha que vc ta falando, é fazer if ou switch? O jfilechooser vc já está usando, para escolher o arquivo..

A gente até tenta resolver esse tipo de dúvida, mas como é algo bem específico seu, pode ser que demore um pouco, ou até que não consigamos.

o JFileChooser estou usando para importar a imagem, no caso seria um switch case para escolher os filtros, no caso agora ele esta usando uma chamada direta do filtro, ai só consigo chamar 1 filtro por vez e tenho que editar o código fonte caso eu queira escolher outro, e quero que o usuário escolha isso!