ImagemScreen.java Source code

Java tutorial

Introduction

Here is the source code for ImagemScreen.java

Source

import java.awt.AWTException;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Rectangle;
import java.awt.Robot;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.awt.image.BufferedImage;
import java.awt.image.BufferedImageOp;
import java.awt.image.ByteLookupTable;
import java.awt.image.ConvolveOp;
import java.awt.image.DataBufferByte;
import java.awt.image.Kernel;
import java.awt.image.LookupOp;
import java.awt.image.WritableRaster;
import java.io.File;
import java.io.IOException;
import java.util.TreeSet;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.imageio.ImageIO;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.filechooser.FileFilter;
import org.opencv.core.Core;
import org.opencv.core.CvType;
import org.opencv.core.Mat;

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * @author Dcio
 */
public class ImagemScreen extends Component implements ActionListener {

    //  private javax.swing.JFileChooser jFileChooserFoto; //caminho completo para o elemento JFileChooser
    //  private javax.swing.JButton cmdChooserPicture; //caminho completo para o elemento JButton
    String descs[] = { "Original", "Convolve : LowPass", "Convolve : Sharpen", "LookupOp", };

    String comandos[] = { "Escolher Fotografia", "Sair do Programa", };

    int opIndex;
    private BufferedImage bi, biFiltered;
    int w, h;

    public static final float[] SHARPEN3X3 = { //sharpening filter kernel
            0.f, -1.f, 0.f, -1.f, 5.f, -1.f, 0.f, -1.f, 0.f

    };

    public static final float[] BLUR3X3 = { //low-pass filter kernel
            0.1f, 0.1f, 0.1f, 0.1f, 0.2f, 0.1f, 0.1f, 0.1f, 0.1f };

    public ImagemScreen() {

        //File imagem = new File("imagem");
        final JFileChooser escolhaArquivo = new JFileChooser();
        try {
            int returnVal = escolhaArquivo.showOpenDialog(null);
            //escolhaArquivo.getFileSelectionMode();
            //escolhaArquivo.addChoosableFileFilter(new TextFilter());

            //int returnVal = escolhaArquivo.showSaveDialog(this);
            if (returnVal == escolhaArquivo.APPROVE_OPTION) {
                File imagem = escolhaArquivo.getSelectedFile();

                bi = ImageIO.read(new File("d:\\1.png"));
                bi = ImageIO.read(imagem);
                w = bi.getWidth(null);
                h = bi.getHeight(null);
            }

            if (bi.getType() != BufferedImage.TYPE_INT_RGB) {
                BufferedImage bi2 = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
                Graphics big = bi2.getGraphics();
                big.drawImage(bi, 0, 0, null);
                biFiltered = bi = bi2;
            }
        } catch (IOException ex) {
            Logger.getLogger(ImagemScreen.class.getName()).log(Level.SEVERE, null, ex);

        }

    }

    public void imagemScreen(File imagem) {

        //File imagem = new File("imagem");
        final JFileChooser escolhaArquivo = new JFileChooser();

        try {
            escolhaArquivo.addChoosableFileFilter(new TextFilter());
            escolhaArquivo.setApproveButtonText("Escolha Arquivo");
            int returnVal = escolhaArquivo.showOpenDialog(null);
            //escolhaArquivo.getFileSelectionMode();
            //escolhaArquivo.addChoosableFileFilter(new TextFilter());

            //int returnVal = escolhaArquivo.showSaveDialog(this);
            if (returnVal == escolhaArquivo.APPROVE_OPTION) {
                imagem = escolhaArquivo.getSelectedFile();

                //bi = ImageIO.read(new File("f:\\1.png"));
                bi = ImageIO.read(imagem);
                w = bi.getWidth(null);
                h = bi.getHeight(null);
            }

            if (bi.getType() != BufferedImage.TYPE_INT_RGB) {
                BufferedImage bi2 = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
                Graphics big = bi2.getGraphics();
                big.drawImage(bi, 0, 0, null);
                biFiltered = bi = bi2;
            }
        } catch (IOException ex) {
            Logger.getLogger(ImagemScreen.class.getName()).log(Level.SEVERE, null, ex);

        }

    }

    public Dimension getPreferredSize() {
        return new Dimension(w, h);
    }

    String[] getDescriptions() {
        return descs;
    }

    void setOpIndex(int i) {
        opIndex = i;

    }

    public void paint(Graphics g) {
        filterImage();
        g.drawImage(biFiltered, 0, 0, null);
    }

    public String[] getComando() {
        return comandos;
    }

    public String[] getFormats() {
        String[] formats = ImageIO.getWriterFormatNames();
        TreeSet<String> formatSet = new TreeSet<String>();

        for (String s : formats) {
            formatSet.add(s.toLowerCase());
        }

        return formatSet.toArray(new String[0]);
    }

    public static void main(String[] args) throws InterruptedException, AWTException, IOException {

        JFrame f = new JFrame("Image Example");

        f.addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                System.exit(0);
            }
        });

        ImagemScreen si = new ImagemScreen();
        f.add("Center", si);

        //
        JComboBox choices = new JComboBox(si.getDescriptions());
        choices.setActionCommand("SetFilter");
        choices.addActionListener(si);

        //  
        JComboBox formats = new JComboBox(si.getFormats());
        formats.setActionCommand("Formats");
        formats.addActionListener(si);

        //
        JComboBox opcao = new JComboBox(si.getComando());
        opcao.setActionCommand("Escolher");
        opcao.addActionListener(si);

        //
        JPanel panel = new JPanel();
        panel.add(opcao);
        panel.add(choices);
        panel.add(new JLabel("Salvar como"));
        panel.add(formats);

        f.add("South", panel);
        f.pack();
        f.setVisible(true);

        System.loadLibrary(Core.NATIVE_LIBRARY_NAME); // load native library of opencv

        byte[] bgrPixelData = ImagemScreen.GetCurrentScreenImage();
        Mat screenFrame = new Mat(600, 600, CvType.CV_8UC3);
        screenFrame.put(0, 0, bgrPixelData);
        // Create a blank output image, that we will draw onto.
        Mat outputFrame = new Mat(screenFrame.size(), CvType.CV_8UC3);
        // Save output and display the openCV Mat image onto the screen.

        //Gravando imagem no disco
        try { //   ImageToScreen.DrawImageToScreen("c:\\temp\\wtf.png", outputFrame);
            BufferedImage teste = createBufferedImage(outputFrame);
            //Obtemos o contexto grfico dessa imagem
            Graphics2D g2d = teste.createGraphics();
            File outputfile = new File("f:\\saved.png");
            boolean write = ImageIO.write(teste, "png", outputfile);
            if (write) {
                System.out.println("Tudo OK!");
            }
            g2d.dispose();
        } catch (IOException e) {
            System.out.println("Error: " + e);
        }

        //Liberamos o contexto.
    }

    public static byte[] GetCurrentScreenImage() throws AWTException, IOException {
        Robot robot = new Robot();
        Dimension d = new Dimension();
        d.height = 10;
        d.width = 10;
        BufferedImage screenShot = robot.createScreenCapture(new Rectangle(d));
        BufferedImage bgrScreenshot = new BufferedImage(screenShot.getWidth(), screenShot.getHeight(),
                BufferedImage.TYPE_3BYTE_BGR);
        boolean done = bgrScreenshot.getGraphics().drawImage(screenShot, 0, 0, null);
        return ((DataBufferByte) bgrScreenshot.getRaster().getDataBuffer()).getData();
    }

    public static BufferedImage createBufferedImage(Mat mat) {
        BufferedImage image = new BufferedImage(mat.width(), mat.height(), BufferedImage.TYPE_3BYTE_BGR);
        WritableRaster raster = image.getRaster();
        DataBufferByte dataBuffer = (DataBufferByte) raster.getDataBuffer();
        byte[] data = dataBuffer.getData();
        mat.get(0, 0, data);
        return image;
    }

    static {
        System.loadLibrary("opencv_java2413");
    }

    @Override
    public void actionPerformed(ActionEvent e) {

        JComboBox cb = (JComboBox) e.getSource();

        if (cb.getActionCommand().equals("SetFilter")) {
            setOpIndex(cb.getSelectedIndex());
            repaint();
        } else if (cb.getActionCommand().equals("Formats")) {
            /**
             * Save the filtered image in the sected format. The selected item
             * will be the name of the format to use
             */
            String format = (String) cb.getSelectedItem();

            /**
             * Use the format name to initialise the file suffix. Format names
             * typically correspond to suffixes
             */
            File saveFile = new File("savedimage." + format);
            JFileChooser chooser = new JFileChooser();
            chooser.setSelectedFile(saveFile);

            int rval = chooser.showSaveDialog(cb);

            if (rval == JFileChooser.APPROVE_OPTION) {
                saveFile = chooser.getSelectedFile();
                try {
                    ImageIO.write(biFiltered, format, saveFile);
                } catch (IOException ex) {
                    System.out.println("Error: " + ex);
                    Logger.getLogger(ImagemScreen.class.getName()).log(Level.SEVERE, null, ex);
                }

            }

        } else if (cb.getActionCommand().equals("Escolher")) {
            /**
             * Escolha de Sair do programa
             */
            String comando = (String) cb.getSelectedItem();

            if (comando.equalsIgnoreCase("Sair do Programa")) {
                System.out.println("Tudo Bem!");
                System.exit(0);
            } else if (comando.equalsIgnoreCase("Escolher Fotografia")) {
                //File imagem = new File("imagem");
                final JFileChooser escolhaArquivo = new JFileChooser();

                int returnVal = escolhaArquivo.showOpenDialog(null);
                //escolhaArquivo.getFileSelectionMode();
                //escolhaArquivo.addChoosableFileFilter(new TextFilter());

                //int returnVal = escolhaArquivo.showSaveDialog(this);
                if (returnVal == escolhaArquivo.APPROVE_OPTION) {
                    File imagem = escolhaArquivo.getSelectedFile();
                    imagemScreen(imagem);

                }

            }

        }

    }

    int lastOp;

    public void filterImage() {
        BufferedImageOp op = null;

        if (opIndex == lastOp) {
            return;
        }
        lastOp = opIndex;

        switch (opIndex) {

        case 0:
            biFiltered = bi; //* original */
            return;
        case 1: /* low pass filter */

        case 2: /* sharpen */

            float[] data = (opIndex == 1) ? BLUR3X3 : SHARPEN3X3;
            op = new ConvolveOp(new Kernel(3, 3, data), ConvolveOp.EDGE_NO_OP, null);

            break;

        case 3: /* lookup */

            byte lut[] = new byte[256];
            for (int j = 0; j < 256; j++) {
                lut[j] = (byte) (256 - j);
            }

            ByteLookupTable blut = new ByteLookupTable(0, lut);
            op = new LookupOp(blut, null);
            break;

        }
        /*
         Rather than directly drawing the filtered image to the
         destination, filter it into a new iage first, then that
         filtered image is ready for writing out or painting.
            
         */
        biFiltered = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
        op.filter(bi, biFiltered);

    }

}