【问题标题】:Inputstream to BufferedImage Conversion damages the fileInputstream 到 BufferedImage 的转换会损坏文件
【发布时间】:2010-11-15 21:32:30
【问题描述】:

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

任何建议或链接将不胜感激!!!

谢谢!

【问题讨论】:

  • 请添加您的写作(输出)代码
  • 你上传的怎么样了?和写作?问题可能出在这些地方吗?你能显示更多代码吗?
  • @Mark Peters:现在更新了我的问题
  • @Traroth:现在更新了问题。看看吧!

标签: java image-processing inputstream bufferedimage


【解决方案1】:

你的代码不工作的原因是在

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

【讨论】:

  • @Zarkonnen:我用了你的getGraphics().drawImage()。但又是之前的问题。带有0 bytes 的图像文件。控制台中没有错误。没有堆栈跟踪。我认为转换只会造成问题。我们有没有其他方法可以将 InputStream 转换为 BufferedImage or 有没有办法从列表项中获取 BUfferedImage 而不是 InputStream。
  • 很可能还有其他问题。您是否真的看到在宽度/高度非零的新创建的 BufferedImage 上使用 ImageIO.write 输出大小为 0?如,如果你只是去 ImageIO.write(new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB), "jpg", new File("foo.jpg")); ?
  • 好的,试试我刚刚编辑的代码。这应该会给你一个 100x100 的缩放图像,或者如果加载失败,则会出现错误消息。 ImageIO 也可能无法识别图像,或者它确实以某种方式损坏。
  • @Zarkonnen:我可以知道你的代码比以前的更改了什么。我无法看到您的代码中的任何更改。我得到正确的输出图像。非常非常感谢人。谢谢你的支持!! :)
  • 我实际上主要是把你的代码和我的代码粘在一起。可能在某个地方有错字或误解。很高兴它现在有效。 :)
【解决方案2】:

这可能只是问题中的一个错字,但 AffineTransformOp 上的过滤器操作使用不正确。

如果uploadImage 是源,它不应该也是过滤的目标。实际上,如果您尝试将 uploadImage 指定为两个参数,filter 应该会抛出异常。

创建一个 BufferedImage 实例作为您的目的地并将其传递给过滤器方法。

【讨论】:

  • 您能从异常的堆栈跟踪中获得任何其他信息吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-17
  • 2011-05-14
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
  • 2011-11-30
  • 2013-03-25
相关资源
最近更新 更多