Capturar webcam con VB.NET

¿Que haremos? Crearemos una aplicación en Visual Studio, la cual hará uso de una webcam para capturar el video en frames independientes y depositarlos en memoria para despues mostralos al usuario a través de un picturebox y un Timer para crear la ilusión de movimiento. ¿Porque lo haremos? Porque es justo y necesario ¿Que necesitamos? [...]

Envío de correo con JavaMail/Netbeans

JavaMail es una expansión de Java que facilita el envío y recepción de e-mail desde código java. JavaMail implementa el protocolo SMTP (Simple Mail Transfer Protocol) así como los distintos tipos de conexión con servidores de correo -TLS, SSL, autentificación con usuario y password, etc [Según SantaWikipedia] ¿Qué necesitamos? JavaMail 1.4.5 Java y Netbeans 6.9 [...]

Proyecto de base de datos Firebird VB

En este proyecto realizaremos una aplicación de base de datos Firebird con el lenguaje de programación de Visual Basic de Microsoft, este proyecto tendrá las funciones básicas de gestión INSERT, DELETE, UPDATE y una interfaz de usuario para utilizarlas. ¿Que necesitamos? Visual Studio 2008 o superior Firebird última versión Firebird ADO.NET Data Provider. Conocimientos básicos [...]

Imprimir imagen con Print

La siguiente clase hace uso de PRINT para imprimir una imagen que se encuentra en un variable de tipo FileInputStream, esta clase a su vez es implementada desde una interfaz que hace fácil su uso, la clase así como todo el proyecto esta comentado. import java.io.File; import javax.print.Doc; import java.io.IOException; import javax.print.DocFlavor; import javax.print.SimpleDoc; import java.io.FileInputStream; [...]

Code Army Bolivia

22/1/11

Java2D: Marca de Agua con Java

JAN29

Java2d nos permite tambien trabajar con archivos de imagen en diferentes formatos, Java2D tambien cuenta con varios metodos para poder manipular estas imagenes. Aqui un pequeño ejemplo de lo que se puede hacer, el siguiente proyecto hecho en netbeans 6.0, sirve para colocar una "marca de agua" sobre una imagen.

Proyecto:
1. Crea un nuevo proyecto en Netbeans, llamalo como quieras, añade un JFrame y llamalo "interfaz.java", despues añade una clase y llamalo "H2O.java", debes tener algo como esto:
2. Trabajaremos con la interfaz de la siguiente manera:
3. El codigo para la clase "H2O.java", es el siguiente:


import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.filechooser.FileNameExtensionFilter;
/**
 * @web http://jc-mouse.blogspot.com/
 * @author Mouse
 */
public class H2O extends JPanel implements MouseMotionListener {
    private FileNameExtensionFilter filter = new FileNameExtensionFilter("Archivo de Imagen","jpg","png");
    //tamaño del contenedor
    private int ancho=0;
    private int alto=0;
    //foto y marca de agua
    private Image Fotografia;
    private Image Marca_de_Agua;
    //imagen que se crea en memoria con ambas imagenes
    private BufferedImage Imagen_en_memoria;
    //coordenadas de la marca de agua
     private int Pos_Marca_X=0, Pos_Marca_Y=0;
     
    public H2O(){     
        this.setPreferredSize(new Dimension(ancho,alto));
        this.setSize(new Dimension(ancho,alto));
        this.setVisible(true);
        this.repaint();        
        addMouseMotionListener(this);
    }
    
    //se sobreescribe el metodo paint
    @Override        
    @SuppressWarnings("empty-statement")
    protected void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D)g;
        //se crea una imagen en memoria
        Imagen_en_memoria = new BufferedImage(this.getWidth(), this.getHeight(), BufferedImage.TYPE_INT_RGB); ;                       
        Graphics2D gOculta = Imagen_en_memoria.createGraphics();
        gOculta.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);        
        //se dibuja las imagenes en el contenedor
        gOculta.drawImage(Fotografia,0,0,this);
        gOculta.drawImage(Marca_de_Agua,this.Pos_Marca_X,this.Pos_Marca_Y,this);
        g2.drawImage(Imagen_en_memoria, 0, 0, this);        
    }

    //muestra una ventana de dialgo para abrir un archivo de imagen
    public String Open(String opcion){
       String file=null; 
       JFileChooser fileChooser = new JFileChooser();       
       fileChooser.setFileFilter(filter);
       int result = fileChooser.showOpenDialog(null);  
       if ( result == JFileChooser.APPROVE_OPTION ){                                 
                //se obtiene la direccion del archivo
                file = fileChooser.getSelectedFile().toString();
                if(opcion.equals("foto")){
                    Fotografia = new ImageIcon(file).getImage();                               
                    ancho = Fotografia.getWidth(this);
                    alto = Fotografia.getHeight(this);                    
                    this.setPreferredSize(new Dimension(ancho,alto));
                    this.setSize(new Dimension(ancho,alto));                          
                }else if(opcion.equals("marca")){
                    Marca_de_Agua = new ImageIcon(file).getImage();                            
                }
                this.repaint();
        }
       return file;
    }   
    
 //abre una ventana de dialogo para escoger la direccion y el nombre del archivo a guardar   
 public void Save(){
       String file=null; 
       JFileChooser fileChooser = new JFileChooser();       
       fileChooser.setFileFilter(filter);
       int result = fileChooser.showSaveDialog(null);
       if ( result == JFileChooser.APPROVE_OPTION ){                                 
                file = fileChooser.getSelectedFile().toString();                
                guardar_imagen(file + ".jpg");           
        }       
    }   

    //metodo que guarda la imagen en disco
    private void guardar_imagen(String f){
        try {
            //se extrae el fomato de la cadena "f" que contiene la direccion
            String formato = (f.endsWith(".jpg")) ? "jpg" : "png";   
            //se escribe en disco
            ImageIO.write(Imagen_en_memoria, formato, new File(f));
            JOptionPane.showMessageDialog(null, "La imagen se guardo correctamente...");
 } catch (IOException e) {            
            JOptionPane.showMessageDialog(null, "Error: no se pudo crear la imagen");
            System.out.println("Error: no se pudo crear la imagen");
 }
   }  
    
    //movimientos del raton
    public void mouseDragged(MouseEvent e) {
            Pos_Marca_X = (int)e.getPoint().getX();
            Pos_Marca_Y = (int)e.getPoint().getY();            
            repaint();
    }

    public void mouseMoved(MouseEvent e) {}   
   
}

Esta clase, "H2O.java" se extiende de un objeto JPanel, y sobreescribe el metodo paintComponent para dibujar una imagen sobre este, la imagen es el resultado de la combinacion de dos imagenes, una grande la imagen de fondo y una mas pequeña que es la marca de agua, esta imagen puede cambiar de posicion, realizando un clic sostendido sobre este y moviendo el mouse.

Asi tambien, esta clase cuenta con con otros metodos para cargar la imagenes mostrando una ventana de dialogo. y claro esta, un metodo para guardar la imagen en disco. Todo el codigo esta extra comentado.

4. Para implementar esta clase "H2O.java" en la interfaz, debemos hacer lo siguiente:


public class interfaz extends javax.swing.JFrame {
    //se crea el objeto jpanel H2O
    H2O j2d = new H2O();      
    
    /** Creates new form interfaz */
    public interfaz() {
        initComponents();   
        this.setTitle("Marca de Agua - by Mouse");
        //se añade el jpanel al Scroll
        jScrollPane1.setViewportView(j2d);         
        this.repaint();     
    }
   
   private void cmdLoad2ActionPerformed(java.awt.event.ActionEvent evt) {
        Imagen2.setText(j2d.Open("marca"));        
        
   }

    private void cmdLoad1ActionPerformed(java.awt.event.ActionEvent evt) {
        Imagen1.setText(j2d.Open("foto"));         
   }

    private void cmdSaveActionPerformed(java.awt.event.ActionEvent evt) {
        if(!Imagen1.getText().isEmpty() && !Imagen2.getText().isEmpty())
            j2d.Save();
   }

 /* resto de codigo en netbeans */    

}

Nota: no copies y pegues, analiza el codigo ;)

Si llegaste hasta aqui, solo nos falta compilar el proyecto y si existe ningun error, vamos a probarlo:

La imagen a la cual le colocaremos la marca de agua es esta:
Si, lo se ;)
Y la marca de agua es
Es un archivo PNG con transparencia, tambien puede ser un archivo JPG

Cargamos las imagenes en la aplicacion:
Podemos dar la hubicacion que queramos a la marca de agua, y despues ya podemos guardar.

Espero que les haya gustado este proyecto, a mi si :)

1 comentarios:

Anónimo dijo...

Tus blogs de procesamiento de imagenes son lo maximo me estan ayudando mucho a comprender java para mi proyecto, gracias

Post recomendado