在基于图像的大型项目中存储和提供图像的方法

Posted

技术标签:

【中文标题】在基于图像的大型项目中存储和提供图像的方法【英文标题】:Approaches to store and serve images in a large image-based project 【发布时间】:2014-04-16 06:34:08 【问题描述】:

我手头有一个大项目。

它基于图像和画廊。

在本网站中,有三种不同尺寸的图片。 原始尺寸、缩略图尺寸、小尺寸

我有一个专门用于这个项目的服务器,所以间距不是我主要关心的问题,尽管我应该注意它,而且出于逻辑上的考虑,没有限制。

我的问题:将图片发布到网站时,哪种方法更好地保存图片?

在发布时将所有三种尺寸保存在三个不同的文件中

或者在加载到页面时动态调整它们的大小,这意味着只保留原始图像

优先级

    质量 性能 存储

【问题讨论】:

更好的方法是在加载到页面时动态调整它们的大小。这样做会阻止存储的质量和更少的使用。同样对于动态调整大小,您应该使用一些缓存图像的库,它也会提高性能。 您是否将其存储在服务器本身上,那么您还必须注意操作...我使用了 blop 类型的数据库 我存储在服务器上,强烈建议不要使用blob @Mostafa 您能否证实您的评论以避免将图像存储在 blob 中? 【参考方案1】:

如果我是您,我不会即时生成(尤其是访问者查看的图片列表很长,性能可能会下降,具体取决于您处理它的方式)。还取决于原始尺寸有多大。无论如何,我都会采用“生成一次”策略并将其缓存在客户端。这样,您还可以在调整大小时提高图像质量,而不必太担心服务器影响(可能会遇到真正的问题,具体取决于规格和同时访问者、上行链路等)。

只是我的 2c。

【讨论】:

我个人更喜欢编写一个类,以便在将它们保存到服务器上后方便地调整大小......是的,我不喜欢即时调整大小,因为它会消耗每个内存请求到达的时间 @Mustafa,是的,这确实是个好主意。调整上传的(或以其他方式接收的图像)的大小,并每次从原始图像调整它的大小(这就是我要做的)。这样,您将保持最佳图像质量。希望这会有所帮助。【参考方案2】:

您将质量列为首要任务,将存储列为最低优先级。在这种情况下,我会以最高可能/可接受的分辨率存储图像并动态调整它们的大小,可能使用缓存机制。 总的来说,请注意缓存也将由浏览器自己执行

编辑:这似乎是 SO 的头像图片(不是 gravatar)的服务方式(图像尺寸在请求中传递以获取图像,尝试更改它们)。

此外,在您项目的这个阶段,实施这两种方法并根据预期负载对它们进行基准测试应该不难。但是,如果缓存没有帮助,我仍然会从动态生成的图像开始,并在稍后阶段预先计算不同的分辨率。

【讨论】:

谢谢。但是很快就会出现一个关于您的方法的问题。每次访问新图像时调整大小不是性能的敌人,而我们可以处理一次调整大小并将其分配一个存储块到... @Mostafa 性能是在特定负载上下文中需要考虑的问题。如前所述,经典的方法是通过缓存机制来支持这种方法,这也将有助于超越图像大小调整的问题,而且还有助于 w.r.t.磁盘读取。这个问题的明确答案将取决于手头的应用程序。我要指出的是,对于合理的原始尺寸,动态调整大小 [+缓存] 是许多人选择的解决方案。 请记住,缓存也将由浏览器完成,因此每个客户端几乎不需要多次调整大小 @Mostafa 另外,通过图像预处理,可以使用诸如尺寸、质量和调整大小算法等常量来约束系统。如果我负担得起的话,我会放弃一种有点塑料的方法,而采用一种更具响应性的方法。

以上是关于在基于图像的大型项目中存储和提供图像的方法的主要内容,如果未能解决你的问题,请参考以下文章

如何提供存储在 cassandra 数据库中的图像? [关闭]

Flask搭建一个最简单的图像分类项目

在Python中处理大型文件的最快方法

项目实战 | 基于图割算法的木材表面缺陷图像分析

项目实战 | 基于图割算法的木材表面缺陷图像分析

使用大型UIImage数组时的内存问题导致崩溃(swift)