我正在使用servelt上传一些图像文件。我想调整图像大小。我使用下面的行将源转换为BufferedImage。
InputStream imageStream = item.getInputStream();
BufferedImage imageBuffer = ImageIO.read(imageStream);
然后我调整图像大小并写入一个位置。但是,所有输出文件大小都是0
。
我使用以下代码调整图像大小。
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
有没有什么好方法可以将输入流转换为bufferedImage而不会损坏图像? 我确信图片上传了。但是,在转换为BufferedImage之后,文件已损坏。
我通过向doPost()方法提交表单来上传。下面的行给出了一个列表项的InputStream。
InputStream imageStream = item.getInputStream();
而且,我正在写
ImageIO.write(image, "jpg", new File(path + ".jpg"));
更新
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)
任何建议或链接都值得赞赏!!!
谢谢!
答案 0 :(得分:5)
您的代码无效的原因在
uploadImage = ato.filter(uploadImage, null); //uploadImage == BufferedImage
您的目标图片为空。
您必须创建一个新的BufferedImage来放置缩放版本,如下所示:
BufferedImage dstImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
ato.filter(uploadImage, dstImage);
然后,保存dstImage(使用ImageIO.write)。
编辑:
缩小图像的一种更简单的方法是将其绘制到正确尺寸的dstImage中:
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"));
答案 1 :(得分:0)
这可能只是问题中的拼写错误,但AffineTransformOp上的过滤操作使用不正确。
如果uploadImage是源,它也不应该是过滤的目的地。实际上,如果您尝试将uploadImage指定为两个参数,则过滤器应抛出异常。
创建一个BufferedImage实例作为目标并将其传递给过滤器方法。