Java - Problema al guardar imagen en disco con java

 
Vista:

Problema al guardar imagen en disco con java

Publicado por Sergio (2 intervenciones) el 22/01/2008 18:04:31
Hola a todos. Estoy intentando guardar una imagen en disco con java pero sólo se me copia como la mitad de la imagen. El codigo de la función que utilizo es el siguiente:

public void guardaImagenEnDisco(ByteArrayInputStream imagenBuffer, byte[] imagen)
{
try
{
File fichero = new File("c:\leon.jpg");
BufferedInputStream in = new BufferedInputStream(imagenBuffer);
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(fichero));

byte[] bytes = new byte[4096];
int len = 0;


while ( (len = in.read( bytes )) > 0 )
{
out.write( bytes, 0, len );
System.out.println("sigue copiando imagen");
}
out.write(imagen);
out.flush();
out.close();
in.close();

}
catch(Exception e)
{

}
}

Pero no hay forma y no se que puede pasar. ¿Alguna otra alternativa mejor quizá?
Saludos.
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:Problema al guardar imagen en disco con java

Publicado por ideasjava (83 intervenciones) el 22/01/2008 18:21:05
Hola. Fijate en este codigo quizas te ayude con lo que quieres. Cualquier cosa pregunta

package es.gaea.utils;

import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import org.apache.log4j.Logger;

/** Clase que implementa un procesador para imagenes y juguetear con ellas */
public class ProcesadorImagenes {

/** Logger de la clase */
private static Logger logger = Logger.getLogger(ProcesadorImagenes.class);

/** Opciones de renderizado para las imagenes */
private RenderingHints opciones = new RenderingHints(null);

/** Constructor de la clase */
public ProcesadorImagenes() {

// Cargo las opciones de renderizado que me apetezcan
opciones.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
opciones.put(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
opciones.put(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE);
opciones.put(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
opciones.put(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
opciones.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
opciones.put(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE);
opciones.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
}

/** Devuelve la lista de formatos disponibles a leer por ImageIO
* @return un array de strings con los mismos.
*/
public String[] dameFormatosUsables(){

return ImageIO.getReaderFormatNames();
}


/** Calcula el factor de escala minimo y en base a eso
* escala la imagen segun dicho factor.
* @param nMaxWidth maximo tamaño para el ancho
* @param nMaxHeight nmaximo tamaño para el alto
* @param imagen Imagen que vamos a escalar
* @return Devuelve la imagen escalada para poderla trastocar o null si hay error
*/
public BufferedImage escalarATamanyo(final BufferedImage imagen,
final int maximoAncho, final int maximoAlto) {

// Comprobacion de parametros
if (imagen == null || maximoAlto == 0 || maximoAncho == 0) {
return null;
}

// Capturo ancho y alto de la imagen
int anchoImagen = imagen.getHeight();
int altoImagen = imagen.getWidth();

// Calculo la relacion entre anchos y altos de la imagen
double escalaX = (double)maximoAncho / (double)anchoImagen;
double escalaY = (double)maximoAlto / (double)altoImagen;

// Tomo como referencia el minimo de las escalas
double fEscala = Math.min(escalaX, escalaY);

// Devuelvo el resultado de aplicar esa escala a la imagen
return escalar(fEscala, imagen);
}


/** Escala una imagen en porcentaje.
* @param factorEscala ejemplo: factorEscala=0.6 (escala la imagen al 60%)
* @param srcImg una imagen BufferedImage
* @return un BufferedImage escalado
*/
public BufferedImage escalar(final double factorEscala, final BufferedImage srcImg) {

// Comprobacion de parametros
if (srcImg == null) {
return null;
}

// Compruebo escala nula
if (factorEscala == 1 ) {

return srcImg;
}

// La creo con esas opciones
AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(factorEscala, factorEscala), opciones);

// Devuelve el resultado de aplicar el filro sobre la imagen
return op.filter(srcImg, null);
}


/** Metodo que guarda una imagen en disco
* @param imagen Imagen a almacenar en disco
* @param rutaFichero Ruta de la imagen donde vamos a salvar la imagen
* @param formato Formato de la imagen al almacenarla en disco
* @return Booleano indicando si se consiguio salvar con exito la imagen
*/
public boolean salvarImagen(final BufferedImage imagen,
final String rutaFichero, final String formato) {

// Comprobacion de parametros
if (imagen != null && rutaFichero != null && formato != null) {

try {
ImageIO.write( imagen, formato, new File( rutaFichero ));
return true;
} catch (Exception e){
// Fallo al guardar
if (logger.isDebugEnabled() == true) {
String CODIGO_MENSAJE_ERROR_GUARDADO_FICHERO =
"No se pudo guardar correctamente la imagen en " +
rutaFichero;
logger.debug(CODIGO_MENSAJE_ERROR_GUARDADO_FICHERO);
}
return false;
}
} else {
// Fallo en los parametros
return false;
}
}


/** Metodo principal de la clase. Usado como prueba
* @param args Argumentos del metodo
*/
public static void main(String args[]) {

// Variables locales
BufferedImage imagen;

try {
imagen = ImageIO.read( new File( "prueba.jpg" ) );
ProcesadorImagenes pi = new ProcesadorImagenes();

// Escalo algunas imagenes como pruebas
BufferedImage imagen800_600 = pi.escalarATamanyo(imagen,800, 600);
BufferedImage imagenSnap_Shot = pi.escalarATamanyo(imagen,96, 96);
BufferedImage imagenMediana = pi.escalarATamanyo(imagen,500, 500);

// Las salvo en disco
pi.salvarImagen(imagen800_600,"imagenG.jpg","jpg");
pi.salvarImagen(imagenSnap_Shot,"imagenP.jpg","jpg");
pi.salvarImagen(imagenSnap_Shot,"imagenE.png","PNG");
pi.salvarImagen(imagenMediana,"imagenA.gif","gif");

// Extraigo la lista de formatos capaces de leer
String[] formatos = pi.dameFormatosUsables();

// los voy mostrando
for (int i=0; i <formatos.length; i++) {
System.out.println(formatos[i].toString());
}

// Final del metodo con exito
System.exit(0);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema al guardar imagen en disco con java

Publicado por sergio (2 intervenciones) el 22/01/2008 19:08:07
Pues lo he probado pero no me funciona, en rutaFichero pongo por ejemplo "C:" pero no me copia la imagen, aparece el icono pero dice k ocupa 0 bytes, a ti te funciona? contesta pronto k es urgente, gracias
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema al guardar imagen en disco con java

Publicado por ideasjava (83 intervenciones) el 23/01/2008 16:35:23
Lo probe varias veces y el codigo funciona correctamente.

Este es el codigo que estoy utilizando actualmente y si funciona.

import java.awt.RenderingHints;
import java.awt.geom.AffineTransform;
import java.awt.image.AffineTransformOp;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;

import java.util.logging.Logger;

import javax.imageio.ImageIO;

/** Clase que implementa un procesador para imagenes y juguetear con ellas */
public class ProcesadorImagenes {

/** Logger de la clase */

/** Opciones de renderizado para las imagenes */
private RenderingHints opciones = new RenderingHints(null);

/** Constructor de la clase */
public ProcesadorImagenes() {

// Cargo las opciones de renderizado que me apetezcan
opciones.put(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
opciones.put(RenderingHints.KEY_ALPHA_INTERPOLATION, RenderingHints.VALUE_ALPHA_INTERPOLATION_QUALITY);
opciones.put(RenderingHints.KEY_DITHERING, RenderingHints.VALUE_DITHER_DISABLE);
opciones.put(RenderingHints.KEY_FRACTIONALMETRICS, RenderingHints.VALUE_FRACTIONALMETRICS_ON);
opciones.put(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_NEAREST_NEIGHBOR);
opciones.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
opciones.put(RenderingHints.KEY_STROKE_CONTROL, RenderingHints.VALUE_STROKE_NORMALIZE);
opciones.put(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
}

/** Devuelve la lista de formatos disponibles a leer por ImageIO
* @return un array de strings con los mismos.
*/
public String[] dameFormatosUsables(){

return ImageIO.getReaderFormatNames();
}


/** Calcula el factor de escala minimo y en base a eso
* escala la imagen segun dicho factor.
* @param nMaxWidth maximo tamaño para el ancho
* @param nMaxHeight nmaximo tamaño para el alto
* @param imagen Imagen que vamos a escalar
* @return Devuelve la imagen escalada para poderla trastocar o null si hay error
*/
public BufferedImage escalarATamanyo(final BufferedImage imagen,
final int maximoAncho, final int maximoAlto) {

// Comprobacion de parametros
if (imagen == null || maximoAlto == 0 || maximoAncho == 0) {
return null;
}

// Capturo ancho y alto de la imagen
int anchoImagen = imagen.getHeight();
int altoImagen = imagen.getWidth();

// Calculo la relacion entre anchos y altos de la imagen
double escalaX = (double)maximoAncho / (double)anchoImagen;
double escalaY = (double)maximoAlto / (double)altoImagen;

// Tomo como referencia el minimo de las escalas
double fEscala = Math.min(escalaX, escalaY);

// Devuelvo el resultado de aplicar esa escala a la imagen
return escalar(fEscala, imagen);
}


/** Escala una imagen en porcentaje.
* @param factorEscala ejemplo: factorEscala=0.6 (escala la imagen al 60%)
* @param srcImg una imagen BufferedImage
* @return un BufferedImage escalado
*/
public BufferedImage escalar(final double factorEscala, final BufferedImage srcImg) {

// Comprobacion de parametros
if (srcImg == null) {
return null;
}

// Compruebo escala nula
if (factorEscala == 1 ) {

return srcImg;
}

// La creo con esas opciones
AffineTransformOp op = new AffineTransformOp(AffineTransform.getScaleInstance(factorEscala, factorEscala), opciones);

// Devuelve el resultado de aplicar el filro sobre la imagen
return op.filter(srcImg, null);
}


/** Metodo que guarda una imagen en disco
* @param imagen Imagen a almacenar en disco
* @param rutaFichero Ruta de la imagen donde vamos a salvar la imagen
* @param formato Formato de la imagen al almacenarla en disco
* @return Booleano indicando si se consiguio salvar con exito la imagen
*/
public boolean salvarImagen(final BufferedImage imagen,
final String rutaFichero, final String formato) {

// Comprobacion de parametros
if (imagen != null && rutaFichero != null && formato != null) {

try {
ImageIO.write( imagen, formato, new File( rutaFichero ));
return true;
} catch (Exception e){
// Fallo al guardar

return false;
}
} else {
// Fallo en los parametros
return false;
}
}


/** Metodo principal de la clase. Usado como prueba
* @param args Argumentos del metodo
*/
public static void main(String args[]){
// Variables locales
BufferedImage imagen;
try {
imagen = ImageIO.read( new File( "p1.jpg" ) );
ProcesadorImagenes pi = new ProcesadorImagenes();
// Escalo algunas imagenes como pruebas
BufferedImage imagen800_600 = pi.escalarATamanyo(imagen,1024, 768);
BufferedImage imagenSnap_Shot = pi.escalarATamanyo(imagen,100, 100);
BufferedImage imagenMediana = pi.escalarATamanyo(imagen,1024, 760);
System.out.println("Bytes = "+imagen);
// Las salvo en disco
pi.salvarImagen(imagen800_600,"D:/imagenG.jpg","jpg");
pi.salvarImagen(imagenSnap_Shot,"D:/imagenP.jpg","jpg");
pi.salvarImagen(imagenSnap_Shot,"D:/imagenE.png","PNG");
pi.salvarImagen(imagenMediana,"D:/imagenA.gif","gif");
// Extraigo la lista de formatos capaces de leer
String[] formatos = pi.dameFormatosUsables();
// los voy mostrando
for (int i=0; i <formatos.length; i++) {
System.out.println(formatos[i].toString());
}
// Final del metodo con exito
System.exit(0);
} catch (IOException e) {
e.printStackTrace();
}
}
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema al guardar imagen en disco con java

Publicado por Nestor Rodriguez (1 intervención) el 21/03/2008 19:08:22
No sera que le falta el "C:/ ", yo lo porbe y funciona
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:Problema al guardar imagen en disco con java

Publicado por Javier Murillo (1 intervención) el 02/03/2008 13:52:14
Hola Sergio,

Soy el autor de la clase que te han enviado previamente.

Solo comentarte que es posible que encontrases ese problema por temas de licencias soucionado en Java 6 si era el formato GIF. Se me habia escapado esa prueba.

Ciertamente, la he dado un buen repaso a la clase y creo que está bastante mejorada, además de haber ido comentando algunos problemas que me surgieron durante la codificación.

Te dejo el enlace:

http://jamurblan.wordpress.com/2008/02/27/un-poco-de-thumbnails-en-java/

Un saludo y suerte
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar