Estoy subiendo algunos archivos de imagen mediante servelt. Quiero cambiar el tamaño de las imágenes. Me convierte en la fuente a BufferedImage por debajo de las líneas.

InputStream imageStream = item.getInputStream();

BufferedImage imageBuffer = ImageIO.read(imageStream);

A continuación, cambia el tamaño de la imagen y escribir en una ubicación. Pero, todos los archivos de salida tamaño es 0.

Estoy usando el siguiente código para cambiar el tamaño de la imagen.

AffineTransform at = new AffineTransform();
if(sx != 0)
    at.scale( sx , sx );
AffineTransformOp ato = new AffineTransformOp(at, AffineTransformOp.TYPE_BILINEAR);
uploadImage = ato.filter(uploadImage, null); //uploadImage == BufferedImage

Hay una buena manera de convertir inputstream a bufferedImage sin dañar la imagen?
Estoy seguro de que la imagen es llegar a cargar. Pero, después de la conversión a BufferedImage, el archivo dañado.

Estoy subiendo por la presentación de un formulario para doPost() método. El debajo de la línea me da la InputStream de un elemento de la lista.

InputStream imageStream = item.getInputStream();

Y, estoy escribiendo por

ImageIO.write(image, "jpg", new File(path + ".jpg"));

Actualización

java.awt.image.ImagingOpException: Unable to transform src image
at java.awt.image.AffineTransformOp.filter(Unknown Source)
at com.pricar.servlet.imageupload.ImageUploadServlet.reSize(ImageUploadServlet.java:100)
at com.pricar.servlet.imageupload.ImageUploadServlet.doPost(ImageUploadServlet.java:74)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:641)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:722)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:511)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:390)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:182)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:765)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:418)
at org.mortbay.jetty.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:230)
at org.mortbay.jetty.handler.HandlerCollection.handle(HandlerCollection.java:114)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:152)
at org.mortbay.jetty.Server.handle(Server.java:326)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:542)
at org.mortbay.jetty.HttpConnection$RequestHandler.content(HttpConnection.java:943)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:756)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:218)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:404)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:410)
at org.mortbay.thread.QueuedThreadPool$PoolThread.run(QueuedThreadPool.java:582)

Cualquier sugerencia sobre o enlace woulb ser agradecidos!!!

Gracias!

  • Por favor, agregue su escritura (salida) código
  • ¿Cómo estás cargando? Y la escritura? Podría el problema en estos puntos? Podría usted mostrar más código?
  • Peters: actualiza Ahora mi pregunta
  • Ahora actualizado a la pregunta. Check it out!
InformationsquelleAutor | 2010-11-15

2 Comentarios

  1. 5

    La razón por la que su código no funciona es en

    uploadImage = ato.filter(uploadImage, null); //uploadImage == BufferedImage

    Su imagen de destino es nulo.

    Usted tiene que crear un nuevo BufferedImage a poner la versión a escala, como este:

    BufferedImage dstImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
    ato.filter(uploadImage, dstImage);

    A continuación, guarde el dstImage (el uso de ImageIO.escribir).

    Edición:

    Una manera más fácil de reducir la escala de la imagen sería simplemente dibujar en el dstImage a la derecha tamaño:

    int dstWidth = 100;
    int dstHeight = 100;
    InputStream imageStream = item.getInputStream();
    BufferedImage srcImage = ImageIO.read(imageStream);
    if (srcImage == null) { System.err.println("NO SOURCE IMAGE!"); }
    BufferedImage dstImage = new BufferedImage(dstWidth, dstHeight,
    BufferedImage.TYPE_INT_RGB);
    dstImage.getGraphics().drawImage(
    srcImage, 0, 0, dstWidth, dstHeight, null);
    ImageIO.write(dstImage, "jpg", new File(path + ".jpg"));
    • Ver editar la mejor manera de incrementar la escala de la imagen.
    • He utilizado la getGraphics().drawImage(). Pero de nuevo el anterior problema. Archivo de imagen con 0 bytes. No hay errores en la consola. No hay pila de strace. Creo que la conversión sólo hacer el problema. ¿Tenemos alguna otra manera de convertir InputStream a BufferedImage or ¿hay alguna manera de conseguir BUfferedImage en lugar de InputStream de los elementos de la lista.
    • Es muy posible hay algún otro problema. Son realmente ver a un tamaño de salida de 0 en el uso de ImageIO.escribir en un recién creado BufferedImage con un valor distinto de cero anchura/altura? Como, ¿qué pasa si usted acaba de ir a ImageIO.escribir(nueva BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB), «jpg», new File(«foo.jpg»)); ?
    • OK, probar el código que acaba de editarse en. Eso te dará una 100×100 escala de la imagen, o un mensaje de error si la carga ha fallado. También es posible que ImageIO no puede reconocer la imagen, o que el hecho de conseguir dañado de alguna manera.
    • Puedo saber en qué te has cambiado el código que la anterior. Yo no puede ver ningún cambio en su código. Me estoy haciendo correcto de la imagen de Salida. Muy muy Gracias hombre. Gracias por su apoyo!! 🙂
    • Yo realmente principalmente pegan el código y la mía. Probablemente hubo un error o un malentendido en algún lugar. Me alegro de que ahora funciona. 🙂
    • Sí, estás en lo correcto. It's also possible that ImageIO can't recognise the image, or that it did indeed get somehow corrupted. Sus sucediendo ahora.
    • Si el cultivo es permitido, usted simplemente puede llamar BufferedImage.subimagen con los parámetros deseados, y guardar el resultado BufferedImage el uso de ImageIO. Debe ser más rápido que el dibujo en un nuevo BufferedImage.

  2. 0

    Esto puede ser un error tipográfico en la pregunta, pero la operación del filtro en AffineTransformOp se utiliza incorrectamente.

    Si uploadImage es la fuente, no debería ser también el destino para el filtrado. De hecho, si se intenta especificar uploadImage como ambos parámetros de filtro debe lanzar una excepción.

    Crear un BufferedImage ejemplo para actuar como su destino y de paso que para el método de filtro.

    • Se puede obtener cualquier información adicional de la excepción del seguimiento de la pila?
    • Ver mis actualizaciones. La traza se actualiza en cuestión.

Dejar respuesta

Please enter your comment!
Please enter your name here