2010-11-15 32 views
2

Je télécharge des fichiers d'image à l'aide de servelt. Je veux redimensionner les images. Je convertis la source en BufferedImage en utilisant les lignes ci-dessous.Inputstream to BufferedImage La conversion endommage le fichier

InputStream imageStream = item.getInputStream();

BufferedImage imageBuffer = ImageIO.read(imageStream);

Puis redimensionner l'image et écrire dans un endroit. Mais, toute la taille des fichiers de sortie est 0. J'utilise le code suivant pour redimensionner l'image.

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 

est-il un bon moyen de convertir inputstream à BufferedImage sans endommager l'image? Je suis sûr que l'image est téléchargée. Mais, après la conversion en BufferedImage, le fichier est endommagé.

Je télécharge en envoyant un formulaire à la méthode doPost(). La ligne ci-dessous me donne l'InputStream d'un élément de liste.

InputStream imageStream = item.getInputStream();

Et, je vous écris par

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

Mise à jour

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) 

Tout suggesstions ou lien woulb être reconnaissants !!!

Merci!

+0

S'il vous plaît ajouter votre écriture (sortie) code –

+0

Comment téléchargez-vous? Et écrit? Le problème pourrait-il être à ces points?Pourriez-vous montrer plus de code? –

+0

@Mark Peters: Maintenant mis à jour ma question –

Répondre

5

La raison pour laquelle votre code ne fonctionne pas est en

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

Votre image de destination est nulle.

Vous devez créer une nouvelle BufferedImage pour mettre la version réduite dans, comme ceci:

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

Ensuite, enregistrez le dstImage (en utilisant ImageIO.write).

Edit:

Un moyen plus facile de réduire l'image serait de tirer juste dans le dstImage à la bonne taille:

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")); 
+0

Voir édition pour une meilleure façon de mettre à l'échelle l'image. – Zarkonnen

+0

@Zarkonnen: J'ai utilisé votre 'getGraphics(). DrawImage()'. Mais encore une fois le problème précédent. Fichier d'image avec '0 octets'. Pas d'erreurs dans la console. Aucune pile de pile. Je pense que la conversion ne fait que rendre le problème. Avons-nous un autre moyen de convertir InputStream en BufferedImage 'ou' Y at-il un moyen d'obtenir BUfferedImage au lieu de InputStream à partir de l'élément de la liste. –

+0

Il est tout à fait possible qu'il y ait d'autres problèmes. Voyez-vous vraiment une taille de sortie de 0 à partir de l'utilisation de ImageIO.write sur un BufferedImage fraîchement créé avec une largeur/hauteur différente de zéro? Comme dans, que se passe-t-il si vous allez simplement ImageIO.write (nouveau BufferedImage (100, 100, BufferedImage.TYPE_INT_RGB), "jpg", nouveau fichier ("foo.jpg")); ? – Zarkonnen

0

Cela peut juste être une faute de frappe dans la question, mais l'opération de filtrage sur AffineTransformOp est utilisée de manière incorrecte.

Si uploadImage est la source, il ne devrait pas être la destination du filtrage. En fait, si vous essayez de spécifier uploadImage comme les deux paramètres, le filtre devrait lancer une exception.

Créez une occurrence BufferedImage comme destination et transmettez-la à la méthode de filtrage.

+0

Pouvez-vous obtenir des informations supplémentaires à partir de la trace de pile de l'exception? – Jeff

+0

Voir ma mise à jour. La trace est mise à jour en question. –