java - 输入流到 BufferedImage 转换损坏文件

标签 java image-processing inputstream bufferedimage

我正在使用servlt上传一些图像文件。我想调整图像的大小。我使用以下几行将源转换为 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 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)

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

谢谢!

最佳答案

您的代码无法正常工作的原因在于

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

关于java - 输入流到 BufferedImage 转换损坏文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4189006/

相关文章:

Java使用绝对路径时显示 "file does not exist"

java - 将年份字段的日期转换为两位数时出错

java - 在 J2ME 中使用 BufferedImage

java - 从 Jackson JsonNode 创建 InputStream 的最佳方式是什么?

java - 服务器在客户端-服务器应用程序中未收到消息

java - 用于运行显示 java.lang.ClassNotFoundException 的 junit 测试的 Ant 脚本

java - 除了用于日志记录目的之外,还有处理 selenium 异常的要点吗?

html - 如何使用 jCrop 插件处理 html5 canvas 对象?

python - Opencv 显示错误的图像宽度和高度

java - 当我需要使用 2 次时,如何重新打开已关闭的 InputStream