我正在为将处理所有图像请求的 Web 项目编写图像服务器。这个想法是一个最大分辨率的图像(例如,让我们说 3000X2000)将存储在文件系统中。当图像请求来自客户端时,将找到适当的文件,然后调整大小以匹配客户端尺寸并返回给浏览器。分解它:
- 从客户端请求并被捕获所有 servlet 捕获的文件
- 屏幕尺寸已存储在客户端 cookie 中。
- 在文件系统上找到最大文件。
- 调整图像大小以匹配用户尺寸。
- 缓冲的图像返回给浏览器。从来没有保存过。
这当然只是一个想法。它使我不必为项目中使用的每张图像保存 5 种不同的图像尺寸,但这是一种现实的方法吗?这是否被任何主要站点用于生产?如果有数千个请求进入大规模,这会导致内存问题吗?文件返回到浏览器后应该立即释放内存吗?
该文件将返回给浏览器:
BufferedImage image = ImageIO.read(f);
OutputStream out = response.getOutputStream();
ImageIO.write(image, "jpg", out);
out.close();
一些仅使用基本 Java 调整大小工具的测试显示速度以毫秒为单位,因此理论上这是可能的,但它当然比预先存储调整大小的图像需要更长的时间。也许能够提供与请求的屏幕尺寸完全正确尺寸的图像将否定稍慢的图像请求?
private static BufferedImage resize(BufferedImage original, int width, int height, int type) {
BufferedImage resized = new BufferedImage(width, height, type);
Graphics2D g = resized.createGraphics();
g.drawImage(original, 0, 0, width, height, null);
g.dispose();
return resized;
}