我差不多完成了创建我的webapp。后端使用Django。这个项目可以让用户上传自己的图像并使用CamanJS对它们进行调整。图像可以具有不同的尺寸,(5mp或更多)和各种颜色。用数字表示用户可能有大概数。每个客户端有60个图像,可能需要1000个客户端。因此,如果我们处理最糟糕的情况,并说每张图像大约3mb,我们就有
3x60 = 180mb for a client
1000x180 = 180.000mb or 180GB for all clients
知道我的应用程序将在线(可能是通过)并且可能有许多用户处理图像大小的最佳方法是什么?如果我将dataURL保存到数据库(base64格式),那会更好吗?这会减少项目所需的高清空间大小吗?我必须说,图像不会丢失其初始细节是很重要的。因此,如果要应用压缩,则不需要降低图像的质量。你认为什么是最好的解决方案?
答案 0 :(得分:0)
保存图像Base64编码将需要大约33%的空间 - 在Base64编码中,每个3个原始字节的块表示为4个字节。如果您的图像是JPEG,那么在不影响图像质量的情况下,您无法获得任何有意义的额外压缩。
JPEG图像已经过压缩。额外的无损压缩(例如zip)可能会导致更大的文件,因此您唯一的选择是质量较低的有损压缩。另请注意,对JPEG图像的任何修改都需要再次进行压缩,并且每次重新编码JPEG文件时都会失去一些质量。如果要对图像进行重复调整,最好使用无损压缩格式(例如PNG),但这些格式会比JPEG格式大得多。
如果您要提供该规模的图像服务,最佳解决方案是将图像存储为文件系统中的常规文件,实际提供这些文件所需的存储容量。将图像存储在数据库中并不会带来性能优势,并且肯定需要比文件系统存储更多的空间(尽管可能不是很多)。如果您使用物理基础架构,必要时可以通过使用固态存储(闪存驱动器)和/或RAID阵列来提高性能。使用SaaS,您无法控制存储,但您的服务提供商可能已经采用了此类策略。
我没有看到一种简单的方法来降低在SaaS服务上为每个用户存储60000个5mpix图像的成本。投资专用的物理基础设施可能会降低成本,但维护自己的硬件也会产生成本。您可能需要将存储成本计入您尝试提供的服务的价格中。
答案 1 :(得分:0)
我认为最好的解决方案是在保存之前调整图像的大小。
高清照片可以具有非常大的尺寸。甚至比显示器的大小还要大。因此,如果您在保存之前调整较小的图像大小,则可以节省大量空间。
例如,我的计算机上有一张名为 forest.jpg 的照片尺寸1.80 MB ,尺寸为3212x2150像素。我的显示器尺寸为1366x768像素。你看,照片的宽度是我显示器宽度的两倍多。
这就是我的所作所为:
>>> from PIL import Image
>>> photo = "C:/users/weasel/desktop/forest.jpg"
>>> im = Image.open(photo)
>>> size = (1000, 1000)
>>> im.thumbnail(size, Image.ANTIALIAS) # thumbnail will maintain the aspect ratio
>>> out_photo = "C:/users/weasel/desktop/forest_resized.jpg"
>>> im.save(out_photo, 'JPEG', quality=85)
PIL
创建的新图片尺寸为1000x669像素,尺寸203 KB 。我认为,由此产生的质量损失是人眼无法察觉的。