Filtro CPL Polarizado ventajas

Programa editor de Imágenes hecho en JAVA (BufferImage, Graphics2D) - Image editor program made in JAVA


Image editor program made in JAVA (BufferImage, Graphics2D)

Bienvenido!!

En este post les quiero compartir un programa editor de imágenes hecho en Java el cual incluye varios filtros; girar imagen, recortar imagen, guardar imagen en varios formatos, hacer zoom, etc.

Aprenderás lo siguiente:
-> Abrir una imagen, cargarla en BufferedImage y mostrarla en un contenedor de Java.
-> Agregar filtros a la imagen, cargarla en BufferedImage (aplica el filtro con Graphics2D).
-> Manejar los colores Rojo, Verde, Azul, Escala de Grises.
-> Entre otros.

Este programa fue implementado con ayuda de otros compañeros.

Les muestro unas capturas con el programa funcionando:












Bueno ahora les muestro algunos de los métodos más importantes:
Declaración de las variables y arreglos necesarios para los filtros:



private BufferedImage imagen, imagen_filtro, copia;
    int w, h, opcion, grados = 0;
    double x1, y1;

/**
     * arreglo estatico de tipo flotante para filtro sharpening
     */
    public static final float[] SHARPEN3x3 = {
        0.f, -1.f, 0.f,
        -1.f, 5.f, -1.f,
        0.f, -1.f, 0.f
    };
    /**
     * arreglo estatico de tipo flotante para filtro detectar bordes
     */
    public static final float[] valores = {
        0.0f, -1.0f, 0.0f,
        -1.0f, 4.0f, -1.0f,
        0.0f, -1.0f, 0.0f
    };
    /**
     * arreglo estatico de tipo flotante para filtro low-pass
     */
    public static final float[] BLUR3x3 = {
        0.1f, 0.1f, 0.1f,
        0.1f, 0.2f, 0.1f,
        0.1f, 0.1f, 0.1f
    };
    //variable estatica tipo short
    public static final short col = 256;
    /**
     * arreglo estatico de tipo flotante para filtro negativo
     */
    public static final short[] coloresInvertidos = new short[col];

    static {
        for (int i = 0; i < col; i++) {
            coloresInvertidos[i] = (short) ((col - 1) - i);
        }
    }
    /**
     * Arreglo para el eliminar el color rojo
     */
    static final short[] coloresSinInvertir_r = new short[col];
    static final short[] cr_cero = new short[col];

    /*Guarda azul*/
    static short[][] elimina_rojo = {
        cr_cero, coloresSinInvertir_r, coloresSinInvertir_r};

    static {
        for (int i = 0; i < col; i++) {
            coloresSinInvertir_r[i] = (short) (i);
            coloresInvertidos[i] = (short) ((col - 1) - i);
            cr_cero[i] = 0;
        }
    }

    /*Guarda rojo*/
    static short[][] elimina_azul = {
        coloresSinInvertir_r, cr_cero, coloresSinInvertir_r};

    /*Guarda Amarillo*/
    static short[][] elimina_verde = {
        coloresSinInvertir_r, coloresSinInvertir_r, cr_cero};


    /*Para ajuste de brillo*/
    public static float p = (float) 2;
    static final float[] componentes = {p, p, p};
    static final float[] desplazamientos = {0.0f, 0.0f, 0.0f};


Ahora los métodos:


/**
     * Metodo para abrir la imagen con JfileChooser
     *
     * @return exportPath variable de tipo cadena
     */
    public String agregar_imagen() {

        JFileChooser file = new JFileChooser();//Objeto de tipo File Chosser para seleccionar la ruta de la imagen
        File ruta = null;// como la ruta cambia de direccion, la inicializo a null como contador

        int estado = file.showOpenDialog(null);//guardo el estado en un entero
        if (estado == JFileChooser.APPROVE_OPTION) {//Si presiono en aceptar entonces se procesa a guardar la direccion

            ruta = file.getSelectedFile();
            String exportPath = file.getSelectedFile().getAbsolutePath();
            System.out.println(exportPath);
            return exportPath;
        }
        return null;
    }//fin deñ metodo cargar imagen

    /**
     * metodo que carga la imagen al bufferedImagen ajustando el tamaño de la
     * ventana
     *
     */
    public void cargaImag() {
        try {
            String url = agregar_imagen();
            imagen = ImageIO.read(new File(url));

            w = imagen.getWidth(); // ancho
            h = imagen.getHeight(); //alto
            if (imagen.getType() != BufferedImage.TYPE_INT_RGB) {
                BufferedImage bi2
                        = new BufferedImage(imagen.getWidth(), imagen.getHeight(), BufferedImage.TYPE_INT_RGB);
                Graphics big = bi2.getGraphics();
                big.drawImage(imagen, 0, 0, w, h, null);
                imagen_filtro = copia = imagen = bi2;
                mos_msj("Imagen cargada correctamente");
            }
            this.setSize(w, h);
        } catch (IOException e) {
            mos_msj("La imagen no se pudo leer");
            //System.exit(1);
        }
    } //fin del metodo cargarimagen


Método que aplica los filtros:

public void agrega_filtro() {
        //declaracion de un buffered image
        BufferedImageOp destino = null;
        //estructura de seleccion switch
        switch (opcion) {
            case 9:
                /* Negativo */
                LookupTable lt = new ShortLookupTable(0, coloresInvertidos);
                destino = new LookupOp(lt, null);
                break;
            case 10:
                /*Detecta bordes*/
                float[] data1 = valores;
                destino = new ConvolveOp(new Kernel(3, 3, data1), ConvolveOp.EDGE_NO_OP, null);
                break;
            case 11:
                /* aumenta escala usando transform Op e interpolacion BICUBIC */
                AffineTransform at = AffineTransform.getScaleInstance(x1, y1);
                destino = new AffineTransformOp(at, AffineTransformOp.TYPE_BICUBIC);
                break;
            case 12:
            /* low pass filter */
            case 13:
                /* sharpen */
                float[] data = (opcion == 12) ? BLUR3x3 : SHARPEN3x3;
                destino = new ConvolveOp(new Kernel(3, 3, data), ConvolveOp.EDGE_NO_OP, null);
                break;
            case 14:
                /* lookup */
                byte lut[] = new byte[256];
                for (int j = 0; j < 256; j++) {
                    lut[j] = (byte) (256 - j);
                }
                ByteLookupTable blut = new ByteLookupTable(0, lut);
                destino = new LookupOp(blut, null);
                break;
            default:
        }
        try {
            imagen_filtro = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB);
            destino.filter(imagen, imagen_filtro);
        } catch (Exception e) {
            System.out.print("");
        }

    } // fin metodo agrega filtro
/**
     * metetodo que pinta sobre el panel
     *
     * @param g variable de tipo graphics
     */
    @Override
    public void paint(Graphics g) {
        //limpia contenido de contexto grafico
        g.clearRect(0, 0, this.getWidth(), this.getHeight());
        switch (opcion) {
            case 0:
                /*Imagen Original*/
                imagen_filtro = imagen;
                g.drawImage(imagen, 0, 0, null);
                break;
            case 1:
                /*Azul*/
                LookupTable azul = new ShortLookupTable(0, elimina_rojo);
                LookupOp az = new LookupOp(azul, null);
                imagen_filtro = az.filter(imagen, null);
                g.drawImage(imagen_filtro, 0, 0, null);
                break;
            case 2:
                /*Brillo*/
                RescaleOp rop2 = new RescaleOp(componentes, desplazamientos, null);
                imagen_filtro = rop2.filter(imagen, null);
                g.drawImage(imagen_filtro, 0, 0, null);
                break;
            case 3:
                /*Gris*/
                ColorConvertOp ccop = new ColorConvertOp(ColorSpace.getInstance(ColorSpace.CS_GRAY), null);
                imagen_filtro = ccop.filter(imagen, null);
                g.drawImage(imagen_filtro, 0, 0, null);
                break;
            case 4:
                /*Girar*/
                double r = Math.toRadians(grados); //se convierte a radianes lo grados
                AffineTransform a = new AffineTransform();
                a.rotate(r, this.getWidth() / 2, this.getHeight() / 2); //se asigna el angulo y centro de rotacion
                ((Graphics2D) g).setTransform(a);
                g.drawImage(imagen_filtro, 0, 0, this);
                break;
            case 5:
                /*Amarillo*/
                LookupTable amarillo = new ShortLookupTable(0, elimina_verde);
                LookupOp ye = new LookupOp(amarillo, null);
                imagen_filtro = ye.filter(imagen, null);
                g.drawImage(imagen_filtro, 0, 0, null);
                break;
            case 6:
                /*Filtro Rojo*/
                LookupTable rojo = new ShortLookupTable(0, elimina_azul);
                LookupOp ro = new LookupOp(rojo, null);
                imagen_filtro = ro.filter(imagen, null);
                g.drawImage(imagen_filtro, 0, 0, null);
                break;
            case 7:
                /*Efecto Espejo*/
                AffineTransform tx = AffineTransform.getScaleInstance(-1, 1);
                tx.translate(-copia.getWidth(null), 0);
                AffineTransformOp op = new AffineTransformOp(tx, AffineTransformOp.TYPE_NEAREST_NEIGHBOR);
                imagen_filtro = op.filter(imagen_filtro, null);
                g.drawImage(imagen_filtro, 0, 0, null);
                break;
            default:
                //apĺica los filtros  que estan dentro del metodo agrega_filtro
                agrega_filtro();
                g.drawImage(imagen_filtro, 0, 0, null);
                break;
        }
    }// fin de paint

Prácticamente estos son los métodos mas importantes del programa.
Espero les sea de mucha ayuda!

Les dejo el link de descarga del proyecto, con todos los archivos y el .jar ya compilado
Descargar

Cualquier duda, sugerencia o comentario dejen su comentario.
Created By Ivan Luis Jimenez (Ivanovich)

Comentarios