我想将图像和其他文档以及每个图像的缩略图存储在 PostgreSQL 表中。原始文档和缩略图将是两个独立的 bytea 字段。PostgreSQL 在 Linux 上运行。
因为图像数据可能来自几个不同的应用程序,所以我希望 PostgreSQL 中的图像处理代码(用于创建缩略图)作为一个函数,而不是每个单独的应用程序都必须创建缩略图。PostgreSQL 有什么方法可以创建图像的缩略图?
我想将图像和其他文档以及每个图像的缩略图存储在 PostgreSQL 表中。原始文档和缩略图将是两个独立的 bytea 字段。PostgreSQL 在 Linux 上运行。
因为图像数据可能来自几个不同的应用程序,所以我希望 PostgreSQL 中的图像处理代码(用于创建缩略图)作为一个函数,而不是每个单独的应用程序都必须创建缩略图。PostgreSQL 有什么方法可以创建图像的缩略图?
我是否可以建议您的所有应用程序改为使用通用接口或 API?
对于我的摄影平台,我有一个上传 API,一切都可以通过,尽管有大约 4 种不同的方式来实际执行上传(浏览器、桌面、手机和软件插件)。然后,上传 API 具有使用一些强大且高性能的库(我使用 Python,所以 PIL)来操作图像的功能,然后将它们保存到数据库中(实际上,我正在保存到文件系统并在其中引用它们) DB,但想法是一样的)。
另一种选择是缩略图生成器服务可以驻留在您的数据库之外,然后偶尔循环遍历所有尚未生成缩略图的行,生成一个,然后将其存储回 Postgres。
如果您最终在 Postgres 内部进行图像处理,特别是在内存方面,那么您要求的性能会受到损害。
PostgreSQL 有什么方法可以创建图像的缩略图?
不。PostgreSQL 是一个数据库引擎,它只允许存储和检索数据,并在一定程度上对其进行操作。但是在里面做一些图像处理就太过分了。图像大小调整应在数据库之外完成。
而且,正如其他评论者所说,还考虑不将图像数据存储在数据库中的选项 - 仅存储一些路径或定位器。这是可选的,但通常更实用。阅读一些相关问题: Storing Images in DB - Yes or Nay? , 存储少量图像:blob 还是 fs?
我只在 perl 中破解过一些微不足道的函数,但如果你安装 pl/perlu,可能会有很多合适的库。
如果 pl/perl2 不是一个选项,请相应地配置 pl/perl:
plperl.use_strict = true
plperl.on_init = 'use stuff1; use stuff2;'
最简单的答案:不要将图像存储在数据库中。它速度慢、效率低、无法扩展、备份时间更长。
当你将它们存储在文件系统上时——只需添加中间件来调整它们的大小,或者一个简单的守护进程来调整所有新图像的大小。