b. Una paleta de 24 bits, tiene 2^24-1 colores. Divida este espacio de colores
en 16 segmentos.
iii. Una vez localizado el segmento, escriba en el archivo nuevo el código del
tono al que corresponde el segmento
Este programa tiene como objetivo crear filtros para imágenes, en este caso se
escogió el color verde para realizar los filtros; entonces lo primero es crear un
proyecto nuevo en Netbeans (lo llamaremos JavaImagenes), le vamos a
añadir 4 clases:
Cubas García Andrea Jazmín 3TM2
Añadiendo package
Añadiendo clases
Clases creadas
Clase BaseImagenes
Cubas García Andrea Jazmín 3TM2
Propiedades:
todasImagenes (private): esta propiedad será un Arraylist de
BufferedImage y almacenará todas las imágenes que se vayan abriendo o
que sufran alguna transformación (escala de grises, blanco y negro, etc.).
El listado es accesible desde el método getTodasImagenes.
infoTodasImagenes (private): esta propiedad es un Arraylist de String
y está relacionado con la propiedad anterior, ya que irá almacenando la
información relativa a la transformación sufrida por la imagen
almacenada. Por ejemplo, cuando se almacene una imagen (dentro de
todasImagenes) porque se ha transformado en blanco y negro, también se
almacenará en esta propiedad (infoTodasImagenes) un String informando
que la imagen se ha transformado a blanco y negro. El listado es accesible
desde el método getInfoTodasImagenes.
contadorImagen (private): esta propiedad sirve para ir llevando
constancia de en qué posición estamos actualmente en los Arraylist
anteriores. Es una variable entera (int).
Métodos/Funciones:
actualizarImagen (protected): este método se utilizar para
almacenar la imagen transformada y la información en los
Arraylist todasImagenes e infoTodasImagenes. Recibe dos parámetros, la
imagen (BufferedImage) y la información de la transformación (String).
deshacerImagen (public): devuelve la imagen (BufferedImage)
anterior a la actual. Esta imagen se extrae de la propiedad todasImagenes.
rehacerImagen (public): devuelve la imagen (BuffereImage)
posterior a la actual. Esta imagen se extrae de la propiedad
todasImagenes.
informacionImagenActual (public): devuelve la información
correspondiente a la imagen actual. Esta función se debe llamar justo
después de hacer la llamada a la función
deshacerImagen/rehacerImagen, para saber a qué corresponde la
imagen.
Esta clase de lo que trata es de ir almacenando todas las imágenes (con su
correspondiente explicación) para que luego éstas sean accesibles desde
el exterior de las clases, en nuestro caso, desde nuestra aplicación con
interfaz de usuario. El código fuente es el siguiente:
package ClasesImagenes;
Cubas García Andrea Jazmín 3TM2
import java.awt.image.BufferedImage;
import java.util.ArrayList;
/**
*
*/
public class BaseImagenes {
/**
* Devuelve el listado completo de todas las imágenes
*/
public static ArrayList<BufferedImage> getTodasImagenes() {
return todasImagenes;
}
/**
* Devuelve el listado completo de toda la información de las imágenes
almacenadas
* en todasImagenes
* @return
*/
public static ArrayList<String> getInfoTodasImagenes() {
return infoTodasImagenes;
}
/**
* Almacena una imagen junto con su información para que luego sea
accesible
* @param imagen imagen que se quiere almacenar
* @param informacion información de la imagen almacenada
*/
protected void actualizarImagen(BufferedImage imagen, String
informacion){
todasImagenes.add(imagen);
infoTodasImagenes.add(informacion);
BaseImagenes.contadorImagen+=1;
}
/**
* Retorna la imagen anterior con respecto a la actual
* En caso de no haber imagen posterior, retorna null
*/
Cubas García Andrea Jazmín 3TM2
/**
* Retorna la imagen posterior a la actual.
* En caso de no haber imagen posterior, retorna null
* @return
*/
public BufferedImage rehacerImagen(){
//Comprueba si hay imágenes posteriores a la actual
if((BaseImagenes.contadorImagen)<BaseImagenes.todasImagenes.siz
e()-1){
BaseImagenes.contadorImagen+=1;
return
BaseImagenes.todasImagenes.get(BaseImagenes.contadorImagen);
}else{
return null;
}
}
/**
* Devuelve la información de la imagen actual
*/
public String informacionImagenActual(){
return
BaseImagenes.infoTodasImagenes.get(BaseImagenes.contadorImagen);
}
}
AbrirImagen
Métodos
Cubas García Andrea Jazmín 3TM2
package ClasesImagenes;
import java.awt.image.BufferedImage;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
/**
*
*
*/
public class AbrirImagen extends BaseImagenes {
private JFileChooser selectorImage;
/**
* Muestra un mensaje de error avisando que no se ha podido cargar la imagen
*/
private void errorImagen(){
JOptionPane.showMessageDialog(null,"No se pudo cargar la imagen","Error",JOptionPane.ERR
}
/**
* Carga el JFIleChooser para seleccionar imagen
* @return devuelve false si la acción fue cancelada por el usuario y true si
* ha seleccionado algún archivo
*/
private boolean abrirJFileChooser(){
this.selectorImage=new JFileChooser();
this.selectorImage.setDialogTitle("Choose an image");
int flag=this.selectorImage.showOpenDialog(null);
if (flag==JFileChooser.APPROVE_OPTION){
return true;
}else{
return false;
}
}
Cubas García Andrea Jazmín 3TM2
/**
* Muestra un cuadro de diálogo para abrir una imagen desde archivo
* @return devuelve la imagen seleccionada o null si no se pudo cargar
*/
public BufferedImage abrirImagenLocal(){
BufferedImage imagenRetorno=null;
if(this.abrirJFileChooser()==true){
try {
imagenRetorno = ImageIO.read(this.selectorImage.getSelectedFile());
if (imagenRetorno!=null){
super.actualizarImagen(imagenRetorno, "Imagen abierta desde archivo");
}else{
errorImagen();
}
} catch (Exception e) {
errorImagen();
}
}
return imagenRetorno;
}
/**
* Carga una imagen a partir de una URL de internet
* @param URLimagen URL de la imagen que se desea abrir
* @return devuelve la imagen obtenida o null si no se pudo cargar
*/
public BufferedImage abrirImagenURL(String URLimagen){
BufferedImage imagenRetorno=null;
try {
URL url = new URL(URLimagen);
imagenRetorno = ImageIO.read(url);
super.actualizarImagen(imagenRetorno, "Imagen abierta desde URL: " + URLimagen);
} catch (Exception e) {
errorImagen();
}
return imagenRetorno;
}
CambiarFormatos
package ClasesImagenes;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
Cubas García Andrea Jazmín 3TM2
import java.awt.image.BufferedImage;
import javax.swing.Icon;
import javax.swing.ImageIcon;
/**
*
*
*/
public class CambiarFormatos{
/**
* Convierte un Icon en Image https://groups.google.com/forum/#!topic/comp.lang.java.progr
*/
public Image iconToImage(Icon icon) {
if (icon instanceof ImageIcon) {
return ((ImageIcon)icon).getImage();
} else {
int w = icon.getIconWidth();
int h = icon.getIconHeight();
GraphicsEnvironment ge =
GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();
GraphicsConfiguration gc = gd.getDefaultConfiguration();
BufferedImage image = gc.createCompatibleImage(w, h);
Graphics2D g = image.createGraphics();
icon.paintIcon(null, g, 0, 0);
g.dispose();
return image;
}
}
Cubas García Andrea Jazmín 3TM2
TransformarImagen
Métodos
Cubas García Andrea Jazmín 3TM2
Añadir Formulario
Una vez hecho, vamos a añadir los controles y el resultado sería algo así.
Cubas García Andrea Jazmín 3TM2
Resultado formulario
?
package javaimagenes;
import ClasesImagenes.AbrirImagen;
import ClasesImagenes.BaseImagenes;
import ClasesImagenes.CambiarFormatos;
import ClasesImagenes.TransformarImagen;
import java.awt.image.BufferedImage;
/**
*
*
*/
public class FormPrincipal extends javax.swing.JFrame {
//Creamos los objetos que manejeramos en los eventos de los diferentes controles
//Los objetos están instanciados
BaseImagenes ObjBase=new BaseImagenes();
AbrirImagen ObjAbrir=new AbrirImagen();
CambiarFormatos ObjCambiarFormat=new CambiarFormatos();
TransformarImagen ObjTransformaImg=new TransformarImagen();
public FormPrincipal() {
initComponents();
}
BufferedImage imagen=ObjAbrir.abrirImagenURL(TextField_URL.getText());
if (imagen!=null){
jLabel_Imagen.setIcon(ObjCambiarFormat.bufferedImageToIcon(imagen));
}
}
TextField_Info.setText(ObjBase.informacionImagenActual());
}
}