Aprende Java Aprende Php Aprende C++ Aprende HTML 5 Aprende JavaScript Aprende JSON Aprende MySQL Aprende SQLServer Aprende Visual Basic 6 Aprende PostgreSQL Aprende SQLite Aprende Redis Aprende Kotlin Aprende XML Aprende Linux VSC Aprende Wordpress Aprende Laravel Aprende VueJS Aprende JQuery Aprende Bootstrap Aprende Netbeans Aprende Android
Sigueme en Facebook Sigueme en Twitter Sigueme en Instagram Sigueme en Youtube Sigueme en TikTok Sigueme en Whatsapp
Home / Java / Proyectos / jFace – Crea retratos hablados

jFace – Crea retratos hablados

Por jc mouse viernes, enero 27, 2012

La policia, el FBI u otros organismos similares utilizaban a dibujantes para realizar el «retrato hablado» de algún maleante, con la tecnologia, esto cambio, y se hicieron programas para facilitar este proceso, entre los programas conocidos tenemos a Faces 4.0 (imagen de abajo) este programa en español y bastante facil de usar puede realizar un retrato en pocos minutos.

¿Que tiene que ver este programa con el post?

Pues en este tuto realizaremos un ejemplo sencillo de Faces 4.0 en Java-Netbeans, y tambien lo cito porque a falta de un buen artista, utilizaremos algunas imagenes propias de este programa (para evitar infracción a las derechos de autor)en nuestro proyecto.

¿Que necesitamos?

  • Conocer de Java (Básico-Intermedio)
  • IDE – Netbeans 6.9 o el que quieras
  • Algunas imagenes, no problem… Bajate estas imagenes
  • 15 minutos de tiempo, mucho no es

Comencemos.

1. Crea un nuevo proyecto en netbeans (proyecto: jface), ahora debemos crear la estructura de la aplicación, es la siguiente:

  • Crea un paquete «imagenes», dentro de este paquete, crea 8 paquetes más para cada una de las partes del rostro (bigote, cabello, cabeza, cejas, labios , mandibula, nariz, ojos), dentro de esos paquetes, debes colocar las imagenes que descargaste al principio del tutorial «Imagenes».

Ahora en el paquete por defecto «jface», crea las siguientes clases:

  • jface.java: Es un JFrame, es la interfaz principal del programa
  • jface_miembro_rostro.java: Es una clase, en esta clase se cargaran las imagenes de cada parte del rostro.
  • jface_panel.java: Es una clase que se extiende de un JPanel, nos permite dibujar el rostro en Java2d
  • jface_rostro.java: Es una clase, une todas las partes del rostro y las dibuja en Java2d

estructura de proyecto

2. Diseño de la interfaz, nada del otro mundo,agrega dos jPanel al JFrame, con las siguientes dimensiones jPanel1 600×700 y jPanel2 230×700, puedes utilizar layouts para alinearlos

diseño de interfaz

3. Vamos al código, el siguiente paso es un Copy/Paste, sin embargo si quieres aprender de verdad, te aconsejo que heches una mirada al código.

Comencemos por la clase jface_miembro_rostro.java

package jface;
import java.awt.Image;
import java.awt.image.BufferedImage;
import java.io.IOException;
import java.net.URL;
import javax.imageio.ImageIO;
/**
 * @web http://jc-mouse.blogspot.com/
 * @author Mouse
 */
public class jface_miembro_rostro {

   private BufferedImage[] imagen;
   private URL _url;   
   private int index=1;

    public jface_miembro_rostro( String miembro){
        load_images(miembro);        
    }

    //carga todas las imagenes en memoria
   private void load_images( String miembro){
        imagen = new BufferedImage[4];
        //se llena el buffer con la imagen
        for(int i=1; i<=3;i++){
            try {
                _url = new URL(getClass().getResource("/imagenes/"+ miembro +"/jface_" + i + ".png").toString());
                imagen[i] = ImageIO.read(_url);                
            } catch (IOException ex) {System.out.println(ex); }
        }
    }

   public void setImagen(int index){
    this.index = index;
   }

   public Image getImagen(){
        return imagen[this.index];
   }

}

Ahora la clase jface_rostro.java

package jface;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
/**
 * @web http://jc-mouse.blogspot.com/
 * @author Mouse
 */
public class jface_rostro {
    //Partes del rostro
    private jface_miembro_rostro cabello;
    private jface_miembro_rostro cabeza;
    private jface_miembro_rostro nariz;
    private jface_miembro_rostro ojos;
    private jface_miembro_rostro labios;
    private jface_miembro_rostro mandibula;
    private jface_miembro_rostro cejas;
    private jface_miembro_rostro bigote;

    public jface_rostro(Dimension contendor){
        cabello     = new jface_miembro_rostro("cabello");
        cabeza      = new jface_miembro_rostro("cabeza");
        nariz       = new jface_miembro_rostro("nariz" );
        ojos        = new jface_miembro_rostro("ojos");
        labios      = new jface_miembro_rostro("labios" );
        mandibula   = new jface_miembro_rostro("mandibula" );
        cejas       = new jface_miembro_rostro("cejas" );
        bigote      = new jface_miembro_rostro("bigote" );
    }

    //Cambia una parte del rostro
    //Entrada: Parte-del-rostro_imagen de tipo String
    public void cambiar_parte_del_rostro(String value){
        String[] val = value.split("_");//divide el comando en dos
        //valores, uno literal y el otro entero
        if( val[0].equals("nariz"))        
            nariz.setImagen( Integer.valueOf(val[1]));
        else if( val[0].equals("ojos"))
            ojos.setImagen( Integer.valueOf(val[1]));
        else if( val[0].equals("labios"))
            labios.setImagen( Integer.valueOf(val[1]));
        else if( val[0].equals("cabello"))
            cabello.setImagen( Integer.valueOf(val[1]));
        else if( val[0].equals("cabeza"))
            cabeza.setImagen( Integer.valueOf(val[1]));
        else if( val[0].equals("mandibula"))
            mandibula.setImagen( Integer.valueOf(val[1]));
        else if( val[0].equals("cejas"))
            cejas.setImagen( Integer.valueOf(val[1]));
        else if( val[0].equals("bigote"))
            bigote.setImagen( Integer.valueOf(val[1]));        
    }

    public void dibujar(Graphics g) {
        Graphics2D g2 = (Graphics2D)g;
        g2.drawImage(cabeza.getImagen(),0,0, null);
        g2.drawImage(mandibula.getImagen(), 0,0, null);
        g2.drawImage(nariz.getImagen(),0,0, null);
        g2.drawImage(ojos.getImagen(), 0,0, null);
        g2.drawImage(labios.getImagen(), 0,0, null);
        g2.drawImage(cabello.getImagen(), 0,0, null);
        g2.drawImage(cejas.getImagen(), 0,0, null);
        g2.drawImage(bigote.getImagen(), 0,0, null);
    }

}

 

clase jface_panel.java

package jface;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.geom.Rectangle2D;
import java.awt.image.BufferedImage;
import javax.swing.BorderFactory;
import javax.swing.JPanel;
/**
 * @web https://www.jc-mouse.net/
 * @author Mouse
 */
public class jface_panel extends JPanel {

    private BufferedImage Imagen_en_memoria;
    private Graphics2D g2d;
    public jface_rostro rostro;    

    //constructor principal
    //Input: Dimension del contenedor padre
    public jface_panel(Dimension d) {
        this.setSize(d);
        this.setPreferredSize(d);
        this.setBorder(BorderFactory.createLineBorder(Color.BLACK));
        rostro = new jface_rostro( this.getSize() );        
    }    

    @Override
    public void paintComponent(Graphics g) {        
        Graphics2D g2 = (Graphics2D)g;
        //imagen en memoria para dibujar en segundo plano
        Imagen_en_memoria = new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_INT_RGB);
        g2d = Imagen_en_memoria.createGraphics();
        g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        g2d.setColor(Color.white);
        g2d.fill(new Rectangle2D.Double(0,0,this.getWidth(), this.getHeight()));        
        rostro.dibujar(g2d);
        g2d.setFont( new Font("Arial",Font.BOLD, 26) );
        g2d.setColor(Color.black);
        g2d.drawString("jFace - Programado por Mouse ", 20, 30);
        g2d.drawString("Visitame: https://www.jc-mouse.net/ ", 20, 60);
        //dibuja toda la imagen
        g2.drawImage(Imagen_en_memoria, 0, 0, this);
    }

}

Para terminar, debemos añadir un poco de código a la clase interfaz jface.java

Si habres el codigo de la clase, veras algo como esto:

package jface;

public class jface extends javax.swing.JFrame {

    /** Creates new form jface */
    public jface() {
        initComponents();        
    }

    /** This method is called from within the constructor to
 * initialize the form.
 * WARNING: Do NOT modify this code. The content of this method is
 * always regenerated by the Form Editor.
 */
    @SuppressWarnings("unchecked")

   /* RESTO DE CODIGO GENERADO POR NETBEANS */

Lo que haremos sera añadir un poco de código, ojo con esto, no es copiary pegar sino cheka el codigo primero, al final debes tener algo como esto:

package jface;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
/**
 * @web https://www.jc-mouse.net/
 * @author Mouse
 */
public class jface extends javax.swing.JFrame {

    private jface_panel lienzo;
    private JButton btn[][];
    ActionListener actionListener ;

    /** Creates new form jface */
    public jface() {
        initComponents();
        //Se inicia la interfaz
        setTitle( "jFace - by Mouse" );
        setLocationRelativeTo(null);
        //se crea instancia a panel y se añade a la interfaz
        lienzo =new jface_panel( this.jPanel1.getSize() );
        this.jPanel1.add(lienzo);
        //alineacion para jpanel de controles
        jPanel2.setLayout(new java.awt.GridLayout(8, 3, 5, 5));//alineacion
        //acciones de los controles "jbutton" para cambiar partes del rostro
        actionListener = new ActionListener() {
          public void actionPerformed(ActionEvent e) {
                String comando = e.getActionCommand();
                lienzo.rostro.cambiar_parte_del_rostro(comando);
                lienzo.repaint();
          }
        };
        //matriz de controles de JButton
        btn = new JButton[8][3];
        botones();
    }

    //Crea la matriz de controlos y añade propiedades
    private void botones()
    {
        String action="";
        for ( int i=0; i < 8; i++ )//filas
        {
            for ( int j=0; j < 3; j++ )//columnas
            {
                btn[i][j] = new JButton();
                btn[i][j].setSize( new Dimension(70,80) );
                btn[i][j].setPreferredSize( new Dimension(70,80) );
                btn[i][j].setText("");
                btn[i][j].setBackground(Color.white);
                switch (i){//Nombres de los eventos
                    case 0: action = "ojos"; break;
                    case 1: action = "labios"; break;
                    case 2: action = "nariz"; break;
                    case 3: action = "cabello"; break;
                    case 4: action = "cabeza"; break;
                    case 5: action = "mandibula"; break;
                    case 6: action = "cejas"; break;
                    case 7: action = "bigote"; break;
                }
                btn[i][j].setToolTipText(action);
                btn[i][j].setActionCommand(action + "_" + (j+1) );//se crea comando
                btn[i][j].setIcon(new javax.swing.ImageIcon(getClass().getResource("/imagenes/"+action+"/jface_"+(j+1)+"_t.png")));
                btn[i][j].addActionListener(actionListener);
                jPanel2.add(btn[i][j]);//se añade al JPanel contenedor
            }
        }
    }

    /** This method is called from within the constructor to
 * initialize the form.
 * WARNING: Do NOT modify this code. The content of this method is
 * always regenerated by the Form Editor.
 */
    @SuppressWarnings("unchecked")

Añadimos algunas librerias y variables, modificamos tambien el constructor de la clase y creamos un metodo privado para crear un array de controles (JButton).

Eso es todo, si terminaste y no tienen ningun error, compila y ejecuta el proyecto, todo el codigo esta comentado si quieres estudiar el codigo no creo que debas tener problemas, sino, preguuuuuuuntame.

proyecto final

Porque no observas el video y ves como quedo 🙂

Enlace de descarga para los más flojos: Codigo Java-Netbeans

Tags

Artículos similares

Ordenación de burbuja animado

La Ordenación de burbuja (Bubble Sort en inglés) es un sencillo algoritmo de ordenamiento. Este algoritmo es esencialmen[...]

Lectura y edición de metadatos con ExifTool

En este post te hablaremos sobre una interesante herramienta para le lectura y edición de metadatos que no te debe de fa[...]

iFrame Injection – Ocultar código malicioso

En ocasiones los administradores de sitios web experimentan problemas de lentitud en su carga o en el peor de los casos[...]

Transición de imágenes al estilo PowerPoint

¿Qué es una transición? Una transición es un efecto de movimiento que se da entre una imagen y la siguiente en una prese[...]

Bolivia Segura: La página web oficial del gobierno para informar sobre el Coronavirus

El gobierno constitucional de Bolivia a la cabeza de la presidente Yaninne Añez y ante la confirmación de dos casos posi[...]

Rompecabezas [Código Fuente]

Hace tiempo me pidieron el código fuente de un juego de Puzzle de Neon Genesis Evangelión, este juego es completo, tiene[...]