首页 > 解决方案 > 对于压缩图像的请求,是关心请求的速度还是压缩图像的大小更好?

问题描述

我正在制作一个 API,用户可以在其中上传个人资料图片。它仍处于起步阶段,但我想知道这方面的扩展性。我为此使用 Spring boot,它归结为 2 个库,我不确定该选择哪个。

第一次测试:原始图片大小:17MB。压缩后:300kb,质量还行。请求速度:350ms

第二次测试:原始大小2MB。压缩后:200kb,质量还行。请求速度:300ms

第一次测试:原始图片大小:17MB。压缩后:140kb,质量不错。请求速度:1.4秒

第二次测试:原始大小2MB。压缩后:99kb,质量不错。请求速度:830ms

(所有测试使用相同的 2 张图片)

如您所见,Scalr 速度更快,但会创建更差的图片和更大的文件大小。Thumbnailator 正好相反。

我很可能会将这些图像保存到 S3 或 Google 存储中,目前还不确定。

所以我的问题是,拥有更小的文件是否更好,这会降低存储成本(Thumbnailator),但请求时间更长,导致更快地使用更强大的服务器、负载平衡器等,这意味着一切都更昂贵。

或者

最好有更快的请求速度,但更大的文件,这意味着更多的存储成本/更慢的图像下载(Scalr)。

我对扩展 API 没有太多经验,但是 300 毫秒 vs 800 和 350 毫秒 vs 1400 毫秒是一笔巨大的交易,对吧?事实上,我知道服务器比存储贵得多,但我不确定在最坏的情况下 1.4 秒是否很糟糕......而且如果图像更大,它可能会更长。

如果有人知道更好的压缩库,甚至知道如何手动完成,我愿意接受建议。

标尺码:

private MultipartFile compress(MultipartFile file) {
            BufferedImage img = ImageIO.read(file.getInputStream());
            BufferedImage thumbnail = resize(img,
                    Scalr.Method.BALANCED,
                    Scalr.Mode.AUTOMATIC,
                    1024,
                    768);
            File outputfile = new File("C:some\\path\\compressed.jpg");
            ImageIO.write(thumbnail, fileFormat, outputfile);
            thumbnail.flush();
}

缩略图代码:

private MultipartFile compress(MultipartFile file) {
    Thumbnails.of(file.getInputStream())
                    .size(1024, 768)
                    .outputQuality(0.4)
                    .toFile(new File(("C:some\\path\\compressed.jpg"));
}
        

我真的不需要在本地保存文件,我还没有弄清楚如何将压缩文件发送回函数调用者,以便我可以上传到 S3。

标签: javaspring-bootrequestcompressionstorage

解决方案


推荐阅读