Programa editor de Imágenes hecho en JAVA (BufferImage, Graphics2D) - Image editor program made in JAVA
- Obtener vínculo
- X
- Correo electrónico
- Otras apps
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:
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 cargarimagenMé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 paintPrá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)
BufferedImage en JAVA
bufferedimagen and graphics 2D en JAVA
editor de imagenes en java
Graphics 2D en JAVA
Image Edit in JAVA
java 2D
- Obtener vínculo
- X
- Correo electrónico
- Otras apps
Comentarios
Publicar un comentario