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) {} }
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:
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:
Tus blogs de procesamiento de imagenes son lo maximo me estan ayudando mucho a comprender java para mi proyecto, gracias
Publicar un comentario