0

我有一个 jpeg 的 BufferedImage 对象,需要作为 servlet 响应进行流式传输。

现有代码使用 JPEGImageEncoder 流式传输 jpeg,如下所示:

JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(resp.getOutputStream());
            resp.reset();
            resp.setContentType("image/jpg");
            resp.setHeader("Content-disposition", "inline;filename=xyz.jpg");
            JPEGEncodeParam param = encoder.getDefaultJPEGEncodeParam(image);
            param.setQuality(jpegQuality, false);
            encoder.setJPEGEncodeParam(param);
            encoder.encode(image);

我注意到这导致流式 jpeg 的文件大小增加了三倍,无法弄清楚为什么。所以我尝试使用 ImageIO 来流式传输 jpeg

ImageIO.write(image, "jpg", out); 

这工作得很好,我无法确定为什么我的前任选择了 JPEGImageEncoder,并且想知道如果我改用 ImageIO 会出现什么问题,我已经比较了两个 jpeg 并且无法真正发现差异。有什么想法吗?

4

1 回答 1

0

需要明确的是,您已经在磁盘或数据库中的某处有一个具体的 JPEG 图像,您只需要将其原封不动地发送给客户端?那么确实绝对没有理由使用JPEGImageEncoder(and ImageIO)。

只需将其未经修改地流式传输到响应正文即可。

例如

File file = new File("/path/to/image.jpg");
response.setContentType("image/jpeg");
response.setHeader("Content-Length", String.valueOf(file.length()));

InputStream input = new FileInputStream(file);
OutputStream output = response.getOutputStream();
byte[] buffer = new byte[8192];

try {
    for (int length = 0; (length = input.read(buffer)) > 0;) {
        output.write(buffer, 0, length);
    }
}
finally {
    try { input.close(); } catch (IOException ignore) {}
    try { output.close(); } catch (IOException ignore) {}
}

您会看到不必要地使用JPEGImageEncoder(and ImageIO) 流式传输图像文件的错误,这些错误通常返回到对位和字节的性质一无所知的初学者的代码中。这些工具仅在您想要在 JPEG 和不同的图像格式之间进行转换,或者想要对其进行操作(裁剪、倾斜、旋转、调整大小等)时才有用。

于 2012-05-04T03:56:45.013 回答