如何在 PostgreSQL 中创建缩略图

发布于 2024-11-03 14:00:20 字数 208 浏览 7 评论 0原文

我想将图像和其他文档以及每个图像的缩略图存储在 PostgreSQL 表中。原始文档和缩略图将是两个单独的字节字段。 PostgreSQL 在 Linux 上运行。

因为图像数据可能来自多个不同的应用程序,所以我希望将 PostgreSQL 中的图像处理代码(用于创建缩略图)作为函数,而不是每个单独的应用程序都必须创建缩略图。 PostgreSQL 有什么办法能够创建图像的缩略图吗?

I want to store images and other documents in a PostgreSQL table, along with a thumbnail of each image. The original document and the thumbnail would be two separate bytea fields. PostgreSQL is running on Linux.

Because the image data could come from several different applications, I'd like to have the image processing code (for creating the thumbnail) within PostgreSQL as a function, rather than each individual application having to create the thumbnail. Is there any way for PostgreSQL to be able to create a thumbnail of an image?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

趴在窗边数星星i 2024-11-10 14:00:20

PostPic 听起来像您正在寻找的 Postgres 扩展。

正如他们的 wiki 中所述,您将能够使用以下命令调整大小和创建缩略图舒适:

函数缩略图(i 图像,大小 INT)返回图像

函数 resize(i image, w INT, h INT) 返回图像

PostPic sounds like the Postgres extension you are looking for.

As described in their wiki you will be able to resize and create thumbnails with ease:

FUNCTION thumbnail(i image, size INT) RETURNS image

FUNCTION resize(i image, w INT, h INT) RETURNS image

半暖夏伤 2024-11-10 14:00:20

我可以建议您的所有应用程序改为使用通用接口或 API 吗?

对于我的摄影平台,我有一个上传 API,一切都可以通过,尽管实际执行上传有大约 4 种不同的方式(浏览器、桌面、手机和软件插件)。然后,上传 API 具有使用一些强大且高性能的库(我使用 Python,所以 PIL)操作图像的功能,然后将它们保存到数据库(实际上,我将保存到文件系统并在中引用它们) DB,但想法是相同的)。

另一种方法是缩略图生成器服务可以驻留在数据库之外,然后偶尔循环遍历尚未生成缩略图的所有行,生成缩略图,然后将其存储回 Postgres。

如果您最终在 Postgres 内部进行图像操作,特别是在内存方面,那么您会要求性能受到极大的损害。

May I suggest instead that all your applications instead use a common interface or an API?

For my photography platform, I have an Upload API that everything goes through, although there are about 4 different ways to actually perform an upload (browser, desktop, phone, and software plugin). The Upload API then has the functionality to manipulate the images with some powerful and performant libraries (I'm using Python, so PIL), and then save them to the database (actually, I'm saving to a file system and referencing them in the DB, but the idea is the same).

An alternative is that a thumbnail generator service could reside outside of your database, and then occasionally loop through all your rows that don't yet have a thumbnail generated, generate one, and then store it back into Postgres.

You're asking for a world of performance hurt if you do end up doing image manipulation inside of Postgres, particularly on the memory side.

携余温的黄昏 2024-11-10 14:00:20

有什么办法可以让PostgreSQL
能够创建一个缩略图
图片?

不。PostgreSQL 是一个数据库引擎,它只允许存储和检索数据,并在某种程度上操作它。但在其中进行一些图像处理就太过分了。
图像大小调整应该在数据库之外完成。

并且,正如其他评论者所说,还要考虑不将图像数据存储在数据库内的选项 - 仅存储某些路径或定位器。这是可选的,但通常更实用。
阅读一些相关问题:
在数据库中存储图像 - 是或否? ,
存储少量图像:blob 还是 fs?

Is there any way for PostgreSQL to be
able to create a thumbnail of an
image?

No. PostgreSQL is a database engine, it just allows to store and retrieve data, and to some extent manipulate it. But doing some image processing inside it would go way too far.
Image resizing should be done outside the database.

And, as other commenter says, consider also the option of not storing the image data inside the database - only some path or locator. This is optional, but frequently it's more practical.
Read some related questions:
Storing Images in DB - Yea or Nay? ,
Storing a small number of images: blob or fs?

随心而道 2024-11-10 14:00:20

我只在 perl 中破解过一些琐碎的函数,但是如果您安装 pl/perlu,很可能有很多合适的库。

如果 pl/perl2 不是一个选项,请相应地配置 pl/perl:

plperl.use_strict = true
plperl.on_init = 'use stuff1; use stuff2;'

I've only ever hacked a few trivial functions in perl, but chances are there are plenty of appropriate libraries if you install pl/perlu.

If pl/perl2 is not an option, configure pl/perl accordingly:

plperl.use_strict = true
plperl.on_init = 'use stuff1; use stuff2;'
海未深 2024-11-10 14:00:20

最简单的答案:不要将图像存储在数据库中。它速度慢、效率低、无法扩展,使备份时间更长。

当您将它们存储在文件系统上时 - 只需添加中间件来调整它们的大小,或者添加一个简单的守护进程来调整所有新图像的大小。

Simplest answer: Do not store images in database. It's slow, ineffective, doesn't scale, makes backups take longer.

And when you'll store them on filesystem - just add middleware to resize them, or a simple daemon which will resize all new images.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文