代码之家  ›  专栏  ›  技术社区  ›  user405398

Inputstream到BufferedImage转换损坏文件

  •  2
  • user405398  · 技术社区  · 15 年前

    我正在使用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
    

    有没有什么好方法可以在不损坏图像的情况下将inputstream转换为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)
    

    任何建议或链接将是赞赏!!!

    谢谢!

    2 回复  |  直到 15 年前
        1
  •  5
  •   Zarkonnen    15 年前

    代码不起作用的原因是

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

    目标图像为空。

    您必须创建一个新的BufferedImage以将缩放版本放入,如下所示:

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

    然后,保存dstamage(使用ImageIO.write)。

    编辑:

    缩小图像的一个更简单的方法是以正确的大小将其绘制到dstamage中:

    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"));
    
        2
  •  0
  •   Jeff    15 年前

    这可能只是问题中的一个输入错误,但AffineTransformOp上的筛选操作使用不正确。

    如果uploadImage是源,那么它不应该也是过滤的目标。事实上,如果您试图指定uploadImage作为两个参数,过滤器应该抛出一个异常。

    创建一个BufferedImage实例作为目标并将其传递给filter方法。

    推荐文章