Foros del Web » Programación para mayores de 30 ;) » Java »

[SOLUCIONADO] pasar de java.awt.Image a bytes[]

Estas en el tema de pasar de java.awt.Image a bytes[] en el foro de Java en Foros del Web. buen dia foreros del web!!. tengo una imagen que de ser normal la puse a escala para hacerla mas pequeña, esto lo hize con la ...
  #1 (permalink)  
Antiguo 08/08/2019, 09:23
 
Fecha de Ingreso: mayo-2013
Ubicación: bogota
Mensajes: 157
Antigüedad: 6 años, 6 meses
Puntos: 2
pasar de java.awt.Image a bytes[]

buen dia foreros del web!!.
tengo una imagen que de ser normal la puse a escala para hacerla mas pequeña, esto lo hize con la clase abstracat Image de la siguiente manera
Código Java:
Ver original
  1. Image img=Image.getScaledInstance(int width, int height, Image.SCALE_AREA_AVERAGING);
Ahora nesecito pasarla a bytes o a inputStream.
he estado de dandole y dandole y no he llegado a una solucion.
Alguno podria hecharme una manita por favor?.
  #2 (permalink)  
Antiguo 08/08/2019, 11:43
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.509
Antigüedad: 11 años, 2 meses
Puntos: 188
Respuesta: pasar de java.awt.Image a bytes[]

Usa BufferedImage para eso.

extension puede ser jpg, jpeg, bmp, png...

BufferedImage originalImage=ImageIO.read(new File("/rutaimagen/nombreimagen.extension"));
ByteArrayOutputStream baos=new ByteArrayOutputStream();
ImageIO.write(originalImage, "extension", baos );
byte[] imageInByte=baos.toByteArray();
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #3 (permalink)  
Antiguo 08/08/2019, 16:56
 
Fecha de Ingreso: mayo-2013
Ubicación: bogota
Mensajes: 157
Antigüedad: 6 años, 6 meses
Puntos: 2
Respuesta: pasar de java.awt.Image a bytes[]

Fuzzylog, gracias por contestar.
El punto es que el método read() recibe un objeto File(ruta) con una ruta para acceder al archivo nesecitado.

Y en este caso lo que hice fue recuperar una imagen que un usuario sube al servidor, yo la tomo, le redimensiono el tamaño, y luego quiero coger esa imagen redimensionada y transformarla a bytes[] y luego guardarla en un campo blob de la bd; lo cual y es lo que quiero decir es que la información guardada en Image no está guardado en una ruta, sino en la variable image, es por eso que quiero convertirla de una vez a byte y guardarla, que supongo yo que así puedo ahorrar recursos.
Eso es lo que me tiene pensando.
Espero haberme hecho entender.
  #4 (permalink)  
Antiguo 11/08/2019, 07:20
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.509
Antigüedad: 11 años, 2 meses
Puntos: 188
Respuesta: pasar de java.awt.Image a bytes[]

Prueba con esto. Conviertes tu Image a Buffered Image

/**
* Converts a given Image into a BufferedImage
*
* @param img The Image to be converted
* @return The converted BufferedImage
*/
public static BufferedImage toBufferedImage(Image img)
{
if (img instanceof BufferedImage)
{
return (BufferedImage) img;
}

// Create a buffered image with transparency
BufferedImage bimage = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB);

// Draw the image on to the buffered image
Graphics2D bGr = bimage.createGraphics();
bGr.drawImage(img, 0, 0, null);
bGr.dispose();

// Return the buffered image
return bimage;
}

y ya tienes la bufferedImage sobre la que aplicar el resto del código.
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #5 (permalink)  
Antiguo 19/08/2019, 08:10
 
Fecha de Ingreso: mayo-2013
Ubicación: bogota
Mensajes: 157
Antigüedad: 6 años, 6 meses
Puntos: 2
Respuesta: pasar de java.awt.Image a bytes[]

Fuzzylog, muchas gracias por contestar.
El código que pusiste lo he estado analizando desde hace varios días que lo ví, y jamás había utilizado el operador "instanceof" y por causa tuya lo encuentro muy útil para el desarrollo de sistemas.
El casting en java tampoco lo había probado y de igual manera aportan mucho a mi razosinio en programación debo agradecerte por eso.
En este fragmento de código
Código Java:
Ver original
  1. ToBufferImage(Image Im){
  2. Ir(img instanceof BufferedImage){
  3. Return (BufferedImage)imag;
  4. }
  5. }
Lo estuve probando y me di cuenta de que el argumento img es una instancia de la clase sun.awt.toolkitImage la cual no se puede hacer casting con el bufferedImage por qué no se relacionan entre sí, ambas heredan de la misma clase pero no hay relación alguna entre estas dos subclases, entonces llegué a la conclusión de que esa condición no se cumpliría nunca.

En el segundo caso es cuando el constructor BufferedImage recibe el ancho, alto y tipo de imagen que es como sigue
Código Java:
Ver original
  1. // Create a buffered image with transparency
  2. BufferedImage bimage = new BufferedImage(img.getWidth(null), img.getHeight(null), BufferedImage.TYPE_INT_ARGB)
  3. // Draw the image on to the buffered image
  4. Graphics2D bGr = bimage.createGraphics();
  5. bGr.drawImage(img, 0, 0, null);
  6. bGr.dispose();
Pero no he logrado entender cómo hace para copiar la imagen si únicamente recibe las coordenadas escalables de la imagen y no la imagen en si ya que no se pudo hacer el casting.

De antemano te agradezco por tu tiempo.
Y sigo en análisis y cuando logré algo, te lo hago saber.
  #6 (permalink)  
Antiguo 21/08/2019, 03:00
Avatar de Fuzzylog  
Fecha de Ingreso: agosto-2008
Ubicación: En internet
Mensajes: 2.509
Antigüedad: 11 años, 2 meses
Puntos: 188
Respuesta: pasar de java.awt.Image a bytes[]

Entonces haz esto para castear ( Basado en la api http://www.docjar.com/docs/api/sun/a...lkitImage.html )

// Imports
import sun.awt.image.ImageRepresentation;

// Codigo
ImageRepresentation imageRep = img.getImageRep();
BufferedImage bimage = imageRep.getBufferedImage();
__________________
if (fuzzy && smooth) {
fuzzylog = "c00l";
return true;
}
  #7 (permalink)  
Antiguo 27/08/2019, 18:40
 
Fecha de Ingreso: mayo-2013
Ubicación: bogota
Mensajes: 157
Antigüedad: 6 años, 6 meses
Puntos: 2
Respuesta: pasar de java.awt.Image a bytes[]

Fuzzylog, al final de tanto buscar y pensar he encontrado la respuesta del casteo, y el orden es como sigue:
1)se sube la imagen al servidor
2)se recupera esa imagen con un inputStream
3)se pasa el inputStream a OutputStream
4)se pasa el OutputStream a byte[]//esta es la imagen en bytes
5)se pasa de bytes[] a Image
6)se pasa de Image a BufferedImage
7)se pasa de BufferedImage a OutputStream
y listo.
Ahora el dilema es el siguiente y no me lo esperaba:
java.lang.IllegalArgumentException: Width (-1) and height (250) cannot be <= 0.
y esto se debe a cuando intentè escalar la imagen.
Que sera?



La zona horaria es GMT -6. Ahora son las 01:45.