Java 服务器端动态自适应映像

Java 服务器端动态自适应映像,java,adaptive-design,Java,Adaptive Design,我正在为一个web项目编写一个图像服务器,它将处理所有图像请求。其思想是将一个最大分辨率的图像(例如3000X2000)存储在文件系统中。当来自客户端的图像请求时,将找到相应的文件,然后调整大小以匹配客户端的尺寸并返回到浏览器。要分解它: 从客户端请求的文件,并由catch-all servlet捕获 屏幕尺寸已存储在客户端cookie中 在文件系统上找到Max文件 图像已调整大小以匹配用户尺寸 缓冲后的图像将返回到浏览器。从未保存过 这当然只是一个想法。它使我不必为项目中使用的每个图像保存5种

我正在为一个web项目编写一个图像服务器,它将处理所有图像请求。其思想是将一个最大分辨率的图像(例如3000X2000)存储在文件系统中。当来自客户端的图像请求时,将找到相应的文件,然后调整大小以匹配客户端的尺寸并返回到浏览器。要分解它:

  • 从客户端请求的文件,并由catch-all servlet捕获
  • 屏幕尺寸已存储在客户端cookie中
  • 在文件系统上找到Max文件
  • 图像已调整大小以匹配用户尺寸
  • 缓冲后的图像将返回到浏览器。从未保存过
  • 这当然只是一个想法。它使我不必为项目中使用的每个图像保存5种不同的图像大小,但这是一种现实的方法吗?是否有任何主要站点在生产中使用此功能?如果有数千个请求传入,这是否会导致内存问题?文件返回到浏览器后,应立即释放内存。是否正确

    文件将返回到浏览器:

    BufferedImage image = ImageIO.read(f);
    OutputStream out = response.getOutputStream();
    ImageIO.write(image, "jpg", out);
    out.close();
    
    一些仅使用基本Java resize工具的测试以毫秒为单位显示速度,因此理论上这是可能的,但它当然会比预先存储调整大小的图像花费更长的时间。也许能够提供与所请求的屏幕尺寸完全匹配的图像将否定稍微慢一点的图像请求

    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;
    }
    

    最重要的问题是:“为什么要这样做?”可能有一个令人信服的原因,但原因是什么?这样我就可以只管理一个图像,而不必为每个可能的屏幕大小以较低的分辨率保存5个不同的副本。您可以通过HTTP生成自己的标题等方式发送调整大小的图像,做一个基准测试,看看完成一个调整大小的请求需要多长时间。调整大图像的大小是缓慢的。这就是为什么我想到了一个最大图像大小约3000像素宽的地方。希望足够大,以适应任何要求,然后缩小必要的。服务器端似乎只需要几毫秒就可以将一个图像从3000调整到300。也就是说,当我将原始文件的大小加倍到6000像素宽时,它会大大增加调整大小的时间…到13秒左右,这是不可接受的。因此,关键在于确定最佳的最大分辨率。