Autor Tema: BufferedImage Java crear a partir de una imagen, definir con setRGB u otro modo  (Leído 32014 veces)

mzamora60

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 17
    • Ver Perfil
Buen dia. Tengo una consulta con respecto a como introducir una imagen como parametro en una clase BufferedImage. Este es un extracto de mi código.

Código: [Seleccionar]
package test3;

import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import javax.swing.JPanel;



public class zoom extends JPanel{
    private Image FOTO_ORIGINAL;
    private Image FOTO_tmp;   
    private BufferedImage Imagen_en_memoria;
    private Graphics2D g2D;
    private boolean con_foto = false;   
    private int valEscalaX=0;
    private int valEscalaY=0;
   
    /* al crear el objeto se crea con una imagen pasada como parametro*/
    public zoom(BufferedImage f){             /*[u][b]esta es la duda de como se mete aqui la foto como parametro[/b][/u]?*/
        this.FOTO_ORIGINAL = f;
        this.FOTO_tmp = f;
        this.setSize(f.getWidth(),f.getHeight());
        this.setVisible(true);
        this.con_foto=true;
    }


Por cuanto se pueda hacer muchas gracias de antemano. Saludos cordiales,
« Última modificación: 06 de Noviembre 2015, 08:16 por Alex Rodríguez »

Alex Rodríguez

  • Moderador Global
  • Experto
  • *******
  • Mensajes: 2054
    • Ver Perfil
Hola la clase BufferedImage se usa para mantener una representación de una imagen en memoria dentro de una aplicación Java, de modo que la puedes modificar o guardar en cualquiera de los formatos estándar propios de imágenes.

Para pasar como parámetro una BufferedImage antes habrás tenido que crearla con un constructor (igual que haces con cualquier otra clase, por ejemplo un ArrayList antes de pasarlo como parámetro tienes que haberlo creado), por ejemplo

Código: [Seleccionar]
import java.awt.image.BufferedImage;

...

BufferedImage img = new BufferedImage(256, 256, BufferedImage.TYPE_INT_RGB);

Esto crea una imagen de 256x256 píxeles sin transparencia. Todavía faltaría "dibujar la imagen", es decir, asignarle valores a sus píxeles, de modo que después puede ser guardada. Para asignar valores a los píxeles se puede hacer a bajo nivel, que sería establecer valores directamente con los métodos setRGB() ó a alto nivel basándonos en definir formas geométricas, una imagen de partida, etc.

Ejemplo de uso:

Código: [Seleccionar]
private void loadData(){
  if (!this.file.exists()) {
    throw new RuntimeException("Skinfile '" + this.file.getName() + "' does not exist!");
  }
  try {
    BufferedImage img=ImageIO.read(this.file);
    this.width=img.getWidth();
    this.height=img.getHeight();
    this.pixelData=new Color[this.width][this.height];
    this.blockTypes=new ColorBlock[this.width][this.height];
    for (int x=0; x < this.width; x++) {
      for (int y=0; y < this.height; y++) {
        this.pixelData[x][this.height - y - 1]=new Color(img.getRGB(x,y));
      }
    }
    this.loaded=true;
  }
 catch (  Exception e) {
    e.printStackTrace();
  }
}

Un ejemplo más completo donde se crea un BufferedImage a partir de una imagen en formato png. En este código tienes que cambiar la línea String imageURL = "image.png"; para poner la ruta de la imagen que quieras utilizar

Código: [Seleccionar]
import java.awt.Component;
import java.awt.Frame;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GraphicsConfiguration;
import java.awt.GraphicsDevice;
import java.awt.GraphicsEnvironment;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.Transparency;
import java.awt.image.BufferedImage;
import java.awt.image.ImageObserver;

public class ImageToBufferedImage {

    static BufferedImage image;
    static boolean imageLoaded = false;

    public static void main(String[] args) {
        // The ImageObserver implementation to observe loading of the image
        ImageObserver myImageObserver = new ImageObserver() {
                public boolean imageUpdate(Image image, int flags, int x, int y, int width, int height) {

                    if ((flags & ALLBITS) != 0) {
                        imageLoaded = true;
                        System.out.println("Image loading finished!");
                        return false;
                    }
                    return true;
                }
            };

        // The image URL - change to where your image file is located!

        String imageURL = "image.png";

        /**
         * This call returns immediately and pixels are loaded in the background
         * We use an ImageObserver to be notified when the loading of the image
         * is complete
         */
        Image sourceImage = Toolkit.getDefaultToolkit().getImage(imageURL);
        sourceImage.getWidth(myImageObserver);

        // We wait until the image is fully loaded
        while (!imageLoaded) {
            try {
                Thread.sleep(100);
            } catch (InterruptedException e) {
            }
        }

        // Create a buffered image from the source image with a format that's compatible with the screen
        GraphicsEnvironment graphicsEnvironment = GraphicsEnvironment.getLocalGraphicsEnvironment();
        GraphicsDevice graphicsDevice = graphicsEnvironment.getDefaultScreenDevice();
        GraphicsConfiguration graphicsConfiguration = graphicsDevice.getDefaultConfiguration();
        // If the source image has no alpha info use Transparency.OPAQUE instead
        image = graphicsConfiguration.createCompatibleImage(sourceImage.getWidth(null), sourceImage.getHeight(null), Transparency.BITMASK);
        // Copy image to buffered image
        Graphics graphics = image.createGraphics();
        // Paint the image onto the buffered image
        graphics.drawImage(sourceImage, 0, 0, null);
        graphics.dispose();
        // Create frame with specific title
        Frame frame = new Frame("Example Frame");
        // Add a component with a custom paint method

        frame.add(new CustomPaintComponent());
        // Display the frame
        int frameWidth = 300;
        int frameHeight = 300;
        frame.setSize(frameWidth, frameHeight);
        frame.setVisible(true);

    }

    /**
     * To draw on the screen, it is first necessary to subclass a Component and
     * override its paint() method. The paint() method is automatically called
     * by the windowing system whenever component's area needs to be repainted.
     */
    static class CustomPaintComponent extends Component {
        public void paint(Graphics g) {
            // Retrieve the graphics context; this object is used to paint shapes
            Graphics2D g2d = (Graphics2D) g;

            /**
             * Draw an Image object The coordinate system of a graphics context
             * is such that the origin is at the northwest corner and x-axis
             * increases toward the right while the y-axis increases toward the
             * bottom.
             */
            int x = 0;
            int y = 0;
            g2d.drawImage(image, x, y, this);

        }
    }
}

Saludos

mzamora60

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 17
    • Ver Perfil
Muchas gracias por la respuesta ya he podido cargar las imágenes, sin embargo requiero cargar la ruta absoluta de las imagenes que se encuentran en un  objeto JTexField dentro de una variable BufferedImage img, pero consigo el siguiente error :

javax.imageio.IIOException: Can't read input file!


Ejemplo:

El JTextField tiene la cadena C:\\User\\Desktop\\imagenes\\foto.jpg lo que requiero es que esta ruta se inserte dentro de la variable de tipo BufferedImage img para que pueda manipular la imagen con los metodos de redimensionamiento que ya programe y probe que trabajan correctamente. Aquí mi código y gracias de antemano por lo que se pueda hacer:
Código: [Seleccionar]

 String fichero = txtimagen.getText(); //Se pretende que la variable fichero almacene la cadena que contendra la ruta absoluta //
      String cod = txtfolio.getText();
      ImageIcon dtCat = new ImageIcon(imagen.getfoto(cod));
      Icon icono = new ImageIcon(dtCat.getImage().getScaledInstance(800, 1050, Image.SCALE_DEFAULT));
      lblimage.setIcon(icono);
      sw = true;
 
           
  try {
     
           
            img = ImageIO.read(new File("")); //aqui es donde se requiere la cadena con la ruta absoluta para traer la imagen con la variable de tipo BufferedImage en este caso img.
           
 } catch (IOException ex) {
            java.util.logging.Logger.getLogger(pagosinfonavit.class.getName()).log(Level.SEVERE, null, ex);
        }
       
       
      pd = new zoom(img); 
      pd.repaint();
      lblimage.add(pd);     
     
     JToolBar barra = new JToolBar();
      JMenuItem aumentar = new JMenuItem("Zoom (+)");
      aumentar.addActionListener(new ActionListener() {
         
   @Override
     public void actionPerformed(ActionEvent e) {
      if(sw){
           
        pd.Aumentar(120);
           
...


En espera de sus valiosos comentarios.  :)

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Buenas tardes , primero comentar que impresionante el aporte de Alex, no hay icono de aplausos aqui jejeje.

Segundo sobre lo que comentas de que requieres la dirección absoluta, echale un vistazo a la clase Path y en concreto a su metodo toAbsolutePath().

Espero te sirva, un saludo.


mzamora60

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 17
    • Ver Perfil

Gracias Lorenzo y en efecto tambien reconozco el perfecto dominio de alex sobre manipulación de imagenes con la clase Image y/o BufferedImage. Ahora dejame explicarte un poco con respecto a lo que requiero el metodo getAbsolutePath() en efecto te devuelve la ruta absoluta y para ello lo que he hecho es crear un objeto de tipo File. Ejemplo:
.
.
.
public static void main (String[] args) {
File ficheroImagen = new File("imagen.jpg");
System.out.println("la ruta absoluta es" + fichero.getAbsolutePath());

}

si corremos este muy sencillo programita en efecto y como tu bien lo comentas arrojara la ruta absoluta por ejemplo:

C:\User\Desktop\imagenes\imagen.jpg

Mi Dilema Lorenzo radica en que ya no necesito obtener la ruta absoluta porque ya la tengo dentro de  un objeto JTextField que en este caso tiene el nombre de txtImagen.getText() y cuya etiqueta es un JLabel denominada Ruta Imagen, ahora bien este contenido de texto (ruta absoluta ), del ya mencionado JTextField necesito que se inserte dentro de mi variable de tipo BufferedImage que se llama img. Anexo código de la variable:

BufferedImage img = null;

img = ImageIO.read(new File("Aqui Lorenzo es donde necesito que se inserte el contenido de texto del JTextField amigo"));


Si lo puedo lograr entonces puedo cantar victoria, jejeje.

:)
 

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Buenas noches, entonces lo que necesitas es simple.

Crea un nuevo objeto:
import java.nio.file.Paths;

Path direccion = Paths.get(txtImagen.getText());
direccion = direccion.toAbsolutePath();

Y luego haz lo siguiente:

BufferedImage img = null;

img = ImageIO.read(new File(direccion.toString()));

Un saludo.
« Última modificación: 25 de Diciembre 2015, 02:15 por Lorenzo31 »

mzamora60

  • Sin experiencia
  • *
  • APR2.COM
  • Mensajes: 17
    • Ver Perfil
Gracias Lorenzo. Pues lo hice tal cual me indicaste y ahora me arroja el siguiente error:

javax.imageio.IIOException: Can't create an ImageInputStream!

 :(

Lorenzo31

  • Avanzado
  • ****
  • APR2.COM
  • Mensajes: 381
    • Ver Perfil
Buenas mzamora60,

Bueno, realmente lo que yo te resolví, o intenté es lo de pasar un JTextField a Path.

De la instrucción siguiente, con el Path lo que si crea seguro es el new File(direccion.toString() );

si yo fuera tu, guardaria ese File en una variable, porque ahora mismo es anónimo.

File archivoImagen = new File (direccion.toString() );

Con eso consigues tenerlo guardado para otras acciones y lo más importante puedes comprobar que se crea correctamente.

Luego ya;
BufferedImage img = ImageIO.read(archivoImagen);

Cuando compruebes que el File se crea correctamente y la imagen, si quieres ya lo volverás a pasar a anonimo con en new File dentro del ImageIO.read.

Yo empezaría por ahí a ver donde da el error. Linea y razon etc.

Un saludo.
« Última modificación: 25 de Diciembre 2015, 12:57 por Lorenzo31 »

 

Sobre la educación, sólo puedo decir que es el tema más importante en el que nosotros, como pueblo, debemos involucrarnos.

Abraham Lincoln (1808-1865) Presidente estadounidense.

aprenderaprogramar.com: Desde 2006 comprometidos con la didáctica y divulgación de la programación

Preguntas y respuestas

¿Cómo establecer o cambiar la imagen asociada (avatar) de usuario?
  1. Inicia sesión con tu nombre de usuario y contraseña.
  2. Pulsa en perfil --> perfil del foro
  3. Elige la imagen personalizada que quieras usar. Puedes escogerla de una galería de imágenes o subirla desde tu ordenador.
  4. En la parte final de la página pulsa el botón "cambiar perfil".