Bienvenido(a), Visitante. Favor de ingresar o registrarse.
Diciembre 05, 2008, 11:15:48
Inicio Ayuda Buscar Ingresar Registrarse
Noticias: Foro de Java, C++ y más.

Empieza una nueva comunidad de programación: Oneble ... es lo que tu quieras que sea

+  Foros Java y C/Linux
|-+  Programación
| |-+  Java J2SE
| | |-+  Guardando imagen desde java
« anterior próximo »
Páginas: [1] 2 Enviar tema Imprimir
Autor Tema: Guardando imagen desde java  (Leído 919 veces)
manix
Full Member
***
Mensajes: 236


manix_10@hotmail.com mamfrey@yahoo.com
Ver Perfil WWW Email


« en: Junio 12, 2008, 02:50:23 »

Que tal amig@s

El otro dia me puse a crear un ejemplo tomando com referencia este que habia planteado webo_cs, y tengo una duda al respecto:
Código:
File fichero = new File("foto.jpg");
String formato = "jpg";

// Creamos la imagen para dibujar en ella.
BufferedImage imagen = new BufferedImage(unaVentana.getContentPane().getWidth(),
unaVentana.getContentPane().getHeight(), BufferedImage.TYPE_INT_RGB);

// Hacemos el dibujo
Graphics g = imagen.getGraphics();
unaVentana.getContentPane().paint(g);

// Escribimos la imagen en el archivo.
try {
ImageIO.write(imagen, formato, fichero);
} catch (IOException e) {
System.out.println("Error de escritura");
}

empece a debatir yo mismo y estoy como en un ciclo sin fin, lleno de confuncion...
la imagen que se va a guardar en el codigo anterior es g o imagen?
si la respuesta es imagen, me pueden explicar en que momento se hace escritura de él en el archivo?
gracias de antemano

saludos
En línea

webo_cs
Full Member
***
Mensajes: 130


En la lucha..

ma_cs_i@hotmail.com
Ver Perfil WWW Email
« Respuesta #1 en: Junio 12, 2008, 03:43:34 »

Hola manix!

Mira, g es un objeto Graphics, el trabajo de g es tomar el control sobre imagen, es decir todo lo que dibuje g lo dibujara sobre imagen, es decir, imagen es el "Lienzo" de g,
la escritura de imagen se hace en el metodo estatico de la calse ImageIO, "write" dentro de la estructura try, esta estructura esta justamente para atrapar cualquier tipo de error de escritura..

saludos
En línea

manix
Full Member
***
Mensajes: 236


manix_10@hotmail.com mamfrey@yahoo.com
Ver Perfil WWW Email
« Respuesta #2 en: Junio 12, 2008, 03:55:50 »

Hola webo!

ya esta mas claro, otra cosa mas, que pasa si no llamo a estas lineas?
Código:
Graphics g = imagen.getGraphics();
unaVentana.getContentPane().paint(g);
me parece que dibuja la imagen sobre el contentPane de la ventana, es asi?

saludos
En línea

webo_cs
Full Member
***
Mensajes: 130


En la lucha..

ma_cs_i@hotmail.com
Ver Perfil WWW Email
« Respuesta #3 en: Junio 12, 2008, 03:58:46 »

HOla,

lo que hacen esas lineas, es tomar el objeto graphics y pedirle que imprima el content pane de la ventana es decir se imprime la ventana sobre la imagen..
esto se hace llamando al meotod paint con g como parametro... si no estuviera la primer linea, g nunca tomaria el control sobre imagen y si no estuviera la segunda, g no dibujaria la ventana sobre imagen..

Saludos
En línea

manix
Full Member
***
Mensajes: 236


manix_10@hotmail.com mamfrey@yahoo.com
Ver Perfil WWW Email
« Respuesta #4 en: Junio 12, 2008, 04:03:15 »

Hola de nuevo!!
creo que ya se por donde va el asunto, entonces la manera de que se guarde una imagen es que esta este dibujada sobre un componente como un frame o un panel? es asi?... de ser asi entonces... lo que se guarda en archivo en realidad es una impresion del componente con la imagen?

saludos
En línea

webo_cs
Full Member
***
Mensajes: 130


En la lucha..

ma_cs_i@hotmail.com
Ver Perfil WWW Email
« Respuesta #5 en: Junio 12, 2008, 04:11:40 »

El objeto buffered image, te sirve para guardar el contenido de los componentes, la forma de imprimir el contenido de los componentes sobre el bufferedimage, es a través de un objeto Graphics que tome el control sobre este, llamando al metodo paint del componente con g como parametro.. se entiende??

Saludos
« Última modificación: Junio 12, 2008, 04:13:32 por webo_cs » En línea

manix
Full Member
***
Mensajes: 236


manix_10@hotmail.com mamfrey@yahoo.com
Ver Perfil WWW Email
« Respuesta #6 en: Junio 12, 2008, 04:27:52 »

Gracias de nuevo webo_cs !!
si se entiende ahora si!!, pero que pasa si la imagen no esta pintada en un componente?


saludos
En línea

webo_cs
Full Member
***
Mensajes: 130


En la lucha..

ma_cs_i@hotmail.com
Ver Perfil WWW Email
« Respuesta #7 en: Junio 12, 2008, 04:30:13 »

La imagen se crea vacia.. si no se le dibuja nada guarda una imagen en blanco.. se crea en la sentencia
Código:
BufferedImage imagen = new BufferedImage(unaVentana.getContentPane().getWidth(),
unaVentana.getContentPane().getHeight(), BufferedImage.TYPE_INT_RGB);

saludos
En línea

manix
Full Member
***
Mensajes: 236


manix_10@hotmail.com mamfrey@yahoo.com
Ver Perfil WWW Email
« Respuesta #8 en: Junio 12, 2008, 04:37:31 »

ok listo!! todo claro...
pero, es posible con este metodo poder hacer esto?

1. cargar una imagen desde una ubicacion en disco
2. poner esta imagen en el contentPane
3. volver a guardar la imagen

Mientras me ayudas voy a intentarlo jijiji

saludos
« Última modificación: Junio 12, 2008, 04:50:55 por manix » En línea

manix
Full Member
***
Mensajes: 236


manix_10@hotmail.com mamfrey@yahoo.com
Ver Perfil WWW Email
« Respuesta #9 en: Junio 12, 2008, 06:51:52 »

Hola..
ya he tenido demasidos intentos fallidos, será posible tal cosa?

saludos
En línea

chuidiang
Administrator
Hero Member
*****
Mensajes: 1985



Ver Perfil WWW Email
« Respuesta #10 en: Junio 12, 2008, 10:52:07 »

Hola:

Un Graphics es una clase con muchos métodos para dibujar. ¿Dónde dibujan? en el sitio del que has obtenido el Graphics. Por ejemplo

Graphics g = unJLabel.getGraphics();

te da un Graphics que dibuja sobre unJLabel. Cualquier drawLine(), drawCosa() o lo que hagas, lo hace sobre el unJLabel.

Graphics g = unBufferedImage.getGraphics();

idem, pero sobre el unBufferedImage.

Por otro lado, todos los componentes java tienen un método paint(Graphics). Ese componente lo que hace es dibujarse sobre el Graphics que le pasan. Habitualmente java llama a este método pasándole el Graphics del mismo componente, por lo que se dibuja sobre sí mismo

Graphics g = unComponente.getGraphics();
unComponente.paint(g);  // el componente se dibuja a sí mismo.

Sin embargo, puedes aprovechar esto para dibujar el componente donde tú quieras

Graphics g = unBufferedImage.getGraphics();
unComponente.paint(g);   // el componente se dibuja en el BufferedImage.

Espero que con esto quede un poco más claro y puedas seguir haciendo tus pruebas.

Se bueno.
En línea

manix
Full Member
***
Mensajes: 236


manix_10@hotmail.com mamfrey@yahoo.com
Ver Perfil WWW Email
« Respuesta #11 en: Junio 13, 2008, 12:11:15 »

muchas gracias webo y chui..
acá voy de nuevo, aprovechando el hilo les comento que estoy creando una aplicacion que lo que hace (al menos es lo que pretendo) es cargar una imagen, luego cambia la imagen rgb a escala de grises. El problema viene cuando trato de cargar la imagen,  por ahora la estoy cargando en un panel de la siguiente forma:
Código:
Image imagen = new ImageIcon("/home/manix...bla bla..jpg").getImage();

Graphics g = panel.getGraphics();
g = imagen.getGraphics();
panel.paint(g);
Pues el error que lanza en esta lineas es "no se puede manipular una imagen que esta manejada por ImageProducer". Les confiezo tengo un nivel demasido bajo en este tema de los graphics, espero que me puedan orientar un poco haber que será mi error. gracias desde ahora

saludos
En línea

webo_cs
Full Member
***
Mensajes: 130


En la lucha..

ma_cs_i@hotmail.com
Ver Perfil WWW Email
« Respuesta #12 en: Junio 13, 2008, 02:52:18 »

hola manix, no entiendo porque obtienes los graphicos del panel y luego los de la imagen, si lo que quieres es el control sobre la imagen solo debes poner a linea

Graphics g = imagen.getGraphics();

Para la aplicacion que estas haceindo, se me ocurre crear una clase que herde de component, es decir crea un nuevo componente y llamalo por ejemplo Lienzo, y l pones a lienzo como atributo un BufferedImage, cargas la imagen fuera o ahi mismo psandole la ruta y la imprimes osbre el componente, de esta forma tenes total control sobre la image, luego tomas el componente y lo pones en un JPanel, x ejemplo.. seria algo asi

Código:

public class Lienzo extends JComponent
{
        //Atributos
private BufferedImage imagen;

        //Constructores
public Lienzo(int x,int y,int ancho,int alto)
{
this.setBounds(x, y, ancho, alto);
this.setVisible(true);

               //Aqui la imagen toma las dimensiones del Lienzo
        imagen=(BufferedImage) this.createImage(ancho, alto);
}
     
public void cargarImagen(String path)
{
LeectorImagenes Lim =new LectorImagenes();
imagen=Lim.cargaImagen(path);
}             

public void paint(Graphics g)
{
    g.drawImage(imagen, 0, 0, this);
}
   
        //Aqui podrias agregar el metodo aEscalaDeGrises y trabajar directamente sobre el atributo imagen
        public void aEscalaDeGrises()
       {
           .....
       }

      //Si desea guardar la imagen agregas un metodo guardar que escriba el atributo que puede o no estar modifcado
      public void GuardarImagen()
       {
           .....
       }
}


se me ocurre algo asi...espero te sirva

Saludos
« Última modificación: Junio 13, 2008, 02:56:12 por webo_cs » En línea

manix
Full Member
***
Mensajes: 236


manix_10@hotmail.com mamfrey@yahoo.com
Ver Perfil WWW Email
« Respuesta #13 en: Junio 13, 2008, 09:14:22 »

Excelenete wbo
voy a ver como me va y luego les cuento

saludos
En línea

ChusterBoy
Newbie
*
Mensajes: 46



Ver Perfil Email
« Respuesta #14 en: Junio 16, 2008, 07:51:37 »

Ehm, ps eso es algo un poco complicado, pero ps aca t dejo un codigo que hace lo que quieres, hay que usar la clase 2D de java

import java.awt.*;
import java.awt.color.*;
import java.awt.image.*;
import java.io.*;
import javax.swing.*;
import com.sun.image.codec.jpeg.*;
public class Imagenes extends JFrame {
public Imagenes() {
super("Procesamiento de imágenes");
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D)g;
try {
InputStream in =
  getClass().getResourceAsStream("../miImagen.jpg");
JPEGImageDecoder decoder = JPEGCodec.createJPEGDecoder(in);
BufferedImage imagen = decoder.decodeAsBufferedImage();
// Aqui se realiza la transformación
ColorConvertOp ccop = new ColorConvertOp(ColorSpace.getInstance
(ColorSpace.CS_GRAY), null);
BufferedImage destino = ccop.filter(imagen,null);
// Aquí termina el proceso
g2.drawImage(destino,0,20,this);
in.close();
}
catch (IOException e) {e.printStackTrace();}
catch (ImageFormatException e) {e.printStackTrace();}
}
public static void main (String args[]) {
Imagenes v = new Imagenes();
v.setDefaultCloseOperation(EXIT_ON_CLOSE);
v.setSize(375,300);
v.setVisible(true);
}
}

Espero y sirva, la vdd y hace exactamente lo que quieres, solo adaptalo..
En línea

╠ Жд∂ع Ђ¥ ™ ╣:

(¯`·._.·×º°”˜`”°º
Páginas: [1] 2 Enviar tema Imprimir 
« anterior próximo »
Ir a:  


Ingresar con nombre de usuario, contraseña y duración de la sesión

Powered by MySQL Powered by PHP Powered by SMF 1.1.5 | SMF © 2006-2007, Simple Machines LLC XHTML 1.0 válido! CSS válido!