Tengo 2 clases: Gestion y VisorEspaciosColor.
En Gestion tengo un ArrayList de BufferedImage, el cual quiero recorrerlo y mostrarlo en forma de video. Para ello utilizo la clase VisorEspaciosColor.
En principio esta clase sirve para mostar una imagen. Lo que quiero es modificarla para que se vaya actualizando el visor. Llevo toda la tarde liado pero no lo he conseguido...
El código es:
import java.awt.image.*;
import java.util.ArrayList;
public class Gestion extends javax.swing.JFrame{
public static void main(String[] args){
ArrayList<BufferedImage> coleccion = new ArrayList<BufferedImage>();
VisorEspaciosColor v = new VisorEspaciosColor(coleccion.get(0));
for(int i = 1; i<coleccion.size();i++){
v.cambiarImagen(coleccion.get(i));
}
}
}
import java.awt.geom.*;
import java.awt.color.*;
import java.io.*;
import javax.imageio.*;
import javax.swing.*;
import java.awt.*;
import java.awt.image.*;
public class VisorEspaciosColor extends JFrame {
class ImagePanel extends JPanel {
BufferedImage imagen;
ImagePanel(BufferedImage imagen) {
this.imagen = imagen;
Dimension d =
new Dimension(this.imagen.getWidth(), this.imagen.getHeight());
setPreferredSize(d);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Dimension d = getSize();
int w = d.width;
int h = d.height;
Graphics2D g2 = (Graphics2D) g;
g2.drawRenderedImage(this.imagen, new AffineTransform());
}
}
private static final int BANDAS = 3;
private JToggleButton botonCanal0 = null;
private JToggleButton botonCanal1 = null;
private JToggleButton botonCanal2 = null;
private float[][] canal = new float[BANDAS][];
private boolean[] canales = new boolean[BANDAS];
private ColorModel colorModel;
private JComboBox espacioColor = null;
private BufferedImage imagen;
private JPanel jContentPane = null;
private javax.swing.JPanel jPanelBotones = null;
private DefaultComboBoxModel listaEspacioColor = null;
private float[] negro;
private String[] nombreEspacioColor = null;
private int tipo = 0;
private int[] tipoEspacioColor = null;
private ImagePanel visor = null;
public VisorEspaciosColor(BufferedImage imagen_video){
imagen = imagen_video;
cargarImagen(imagen_video);
this.initialize();
this.pack();
this.setVisible(true);
}
public void cambiarImagen(BufferedImage imagen_video){
imagen = imagen_video;
cargarImagen(imagen_video);
this.pack();
this.setVisible(true);
}
public void video(String ruta){
cargarImagen(ruta);
initialize();
pack();
setVisible(true);
}
void actualizarImagen(){
visor.imagen = generarImagen();
visor.repaint();
}
private void cargarImagen(BufferedImage imagen_video) {
imagen = imagen_video;
}
private void cargarImagen(String fichero) {
FileInputStream fin = null;
try{
fin = new FileInputStream(fichero);
imagen = ImageIO.read(new FileInputStream(fichero));
}catch(IOException ioe){
ioe.printStackTrace();
}finally{
if(fin != null)
try{
fin.close();
}catch(IOException ioec){
ioec.printStackTrace();
}
}
}
private void convertirEspacioDeColor() {
BufferedImage destino;
int tipoOrigen = imagen.getColorModel().getColorSpace().getType();
ColorSpace colorSpace = new ICC_ColorSpace(ICC_Profile.getInstance(tipo));
if (tipoOrigen != colorSpace.getType()) {
ColorConvertOp convertirColor =
new ColorConvertOp(
imagen.getColorModel().getColorSpace(),
colorSpace,
null);
colorModel =
new ComponentColorModel(
colorSpace,
false,
false,
Transparency.OPAQUE,
DataBuffer.TYPE_FLOAT);
destino =
convertirColor.createCompatibleDestImage(imagen, colorModel);
destino = convertirColor.filter(imagen, destino);
} else {
destino = imagen;
this.colorModel = imagen.getColorModel();
colorSpace = this.colorModel.getColorSpace();
}
Raster raster = destino.getData();
int ancho = destino.getWidth();
int alto = destino.getHeight();
negro = colorSpace.fromCIEXYZ(new float[] { 0, 0, 0 });
for (int i = 0; i < BANDAS; i++)
canal[i] = raster.getSamples(0, 0, ancho, alto, i, (float[]) null);
}
private BufferedImage generarImagen() {
int ancho = imagen.getWidth();
int alto = imagen.getHeight();
WritableRaster raster =
colorModel.createCompatibleWritableRaster(ancho, alto);
for (int i = 0; i < BANDAS; i++)
if (canales[i])
raster.setSamples(0, 0, ancho, alto, i, canal[i]);
else {
float[] datos = new float[canal[i].length];
for (int j = 0; j < datos.length; j++)
datos[j] = negro[i];
raster.setSamples(0, 0, ancho, alto, i, datos);
}
BufferedImage imagen =
new BufferedImage(colorModel, raster, false, null);
ColorModel sRGBColorModel = ColorModel.getRGBdefault();
ColorConvertOp convertirColor =
new ColorConvertOp(
colorModel.getColorSpace(),
sRGBColorModel.getColorSpace(),
null);
BufferedImage destino =
convertirColor.createCompatibleDestImage(imagen, sRGBColorModel);
destino = convertirColor.filter(imagen, destino);
return destino;
}
private JToggleButton getBotonCanal0() {
if (botonCanal0 == null) {
botonCanal0 = new JToggleButton();
botonCanal0.setText("Canal 0");
botonCanal0.setSelected(true);
botonCanal0
.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent e) {
canales[0] = botonCanal0.isSelected();
actualizarImagen();
}
});
canales[0] = true;
}
return botonCanal0;
}
private JToggleButton getBotonCanal1() {
if (botonCanal1 == null) {
botonCanal1 = new JToggleButton();
botonCanal1.setText("Canal 1");
botonCanal1.setSelected(true);
botonCanal1
.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent e) {
canales[1] = botonCanal1.isSelected();
actualizarImagen();
}
});
canales[1] = true;
}
return botonCanal1;
}
private JToggleButton getBotonCanal2() {
if (botonCanal2 == null) {
botonCanal2 = new JToggleButton();
botonCanal2.setText("Canal 2");
botonCanal2.setSelected(true);
botonCanal2
.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent e) {
canales[2] = botonCanal2.isSelected();
actualizarImagen();
}
});
canales[2] = true;
}
return botonCanal2;
}
private JComboBox getEspacioDeColor() {
if (espacioColor == null) {
espacioColor = new JComboBox();
espacioColor.setModel(getListaEspacioColor());
espacioColor.addItemListener(new java.awt.event.ItemListener() {
public void itemStateChanged(java.awt.event.ItemEvent e) {
int i = espacioColor.getSelectedIndex();
tipo = tipoEspacioColor[i];
convertirEspacioDeColor();
actualizarImagen();
}
});
}
return espacioColor;
}
private ImagePanel getImagen() {
BufferedImage imagen = generarImagen();
if (visor == null) {
visor = new ImagePanel(imagen);
}
return visor;
}
private JPanel getJContentPane() {
if (jContentPane == null) {
jContentPane = new javax.swing.JPanel();
jContentPane.setLayout(new java.awt.BorderLayout());
jContentPane.add(getJPanel(), java.awt.BorderLayout.EAST);
jContentPane.add(getEspacioDeColor(), java.awt.BorderLayout.NORTH);
jContentPane.add(getImagen(), java.awt.BorderLayout.CENTER);
}
return jContentPane;
}
private javax.swing.JPanel getJPanel() {
if (jPanelBotones == null) {
jPanelBotones = new javax.swing.JPanel();
jPanelBotones.setLayout(
new javax.swing.BoxLayout(
jPanelBotones,
javax.swing.BoxLayout.Y_AXIS));
jPanelBotones.add(getBotonCanal0(), null);
jPanelBotones.add(getBotonCanal1(), null);
jPanelBotones.add(getBotonCanal2(), null);
}
return jPanelBotones;
}
private DefaultComboBoxModel getListaEspacioColor() {
if (listaEspacioColor == null) {
int numeroTipos = 4;
nombreEspacioColor = new String[numeroTipos];
tipoEspacioColor = new int[numeroTipos];
nombreEspacioColor[0] = "sRGB";
tipoEspacioColor[0] = ColorSpace.CS_sRGB;
nombreEspacioColor[1] = "RGB lineal";
tipoEspacioColor[1] = ColorSpace.CS_LINEAR_RGB;
nombreEspacioColor[2] = "PhotoYCC";
tipoEspacioColor[2] = ColorSpace.CS_PYCC;
nombreEspacioColor[3] = "CIE XYZ";
tipoEspacioColor[3] = ColorSpace.CS_CIEXYZ;
listaEspacioColor = new DefaultComboBoxModel(nombreEspacioColor);
int i = 0;
int tipo = imagen.getColorModel().getColorSpace().getType();
while (tipo != ColorSpace.getInstance(tipoEspacioColor[i]).getType())
if (++i >= tipoEspacioColor.length)
throw new RuntimeException("Tipo " + tipo + "desconocido");
listaEspacioColor.setSelectedItem(nombreEspacioColor[i]);
this.tipo = tipoEspacioColor[i];
this.convertirEspacioDeColor();
}
return listaEspacioColor;
}
private void initialize() {
this.setSize(300, 200);
this.setContentPane(getJContentPane());
this.setTitle("Visor del codec");
this.addWindowListener(new java.awt.event.WindowAdapter() {
public void windowClosing(java.awt.event.WindowEvent e) {
System.exit(0);
}
});
}
}
(En VisorEspaciosColor hay mucho código que no es muy importante, la parte esencial es el constructor y el método cambiarImagen).
Como veis, en Gestion creo un nuevo Visor, el cual se encarga de mostrar la primera imagen de la colección.
La idea es, en el siguiente bucle, refrescar la imagen pasándole una nueva imagen. El método cambiarImagen asigna a la variable global del Visor la nueva imagen e intento mostarla, pero sólo se ve la primera!!!
Alguien me puede ayudar??
Gracias!