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 :)