PHP创建超大图像文件

Posted

技术标签:

【中文标题】PHP创建超大图像文件【英文标题】:PHP creates super large image file 【发布时间】:2018-05-22 12:16:56 【问题描述】:

在我的应用中,用户上传多张照片(例如,每张 3000x2000,JPG 和 PNG 格式)。我的 php 程序需要对这些照片进行布局并将它们组合成 1 张大照片。

例如,用户上传了 4 张照片 - p1.jpg、p2.jpg、p3.jpg、p4.jpg,每张都是 3000x2000。我需要创建一个大图像,将 4 个图像放置在这样的 2x2 网格布局中 -

+-----+-----+  (overall witdh = 6000, overall height = 4000)
| p1  | p2  |
+-----+-----+
| p3  | p4  |
+-----+-----+

我可以将每张图片缩小(例如原图的 50%),这样整体尺寸可以缩小,但如果用户上传 8 张图片或 16 张图片,整体尺寸会再次变大。

生成的图像将在 PHP 中消耗非常高的内存,所以我的问题是,以最少的内存消耗创建大图像的最佳方法是什么。

我的一个想法是我们使用流来逐块处理大型数据文件。所以我想知道是否有允许逐块图像合并的解决方案/库。

【问题讨论】:

作业队列对于此类消耗内存的进程来说是个好主意...现在取决于您应用的技术堆栈 我会接受这样一个事实,即它会使用大量内存,创建一个后台工作程序来接受来自队列的图像转换作业,并保留一个足够大的服务器来运行预定数量的这些工作程序,所以你可以控制他们使用多少内存。您要做的最后一件事是在 Web 服务器线程中运行此类任务,更不用说其中许多不受控制的并行了。 【参考方案1】:

我可以建议,您可以独立上传所有图像,而不是上传一张大图,但在显示或下载时您可以编写一些脚本,将所有上传的图像转换为一张大图布局。

如果您有图像的特定位置,那么您可以使用名为http://fabricjs.com/ 的画布库。通过使用这个库,您可以自定义您的图像,您可以将所有图像位置保存在数据库中,然后您可以根据该位置获取图像。

【讨论】:

以上是关于PHP创建超大图像文件的主要内容,如果未能解决你的问题,请参考以下文章

php 为图像上载创建符号链接文件

如何使用 PHP 从 base64 编码的数据/字符串创建图像并将其保存到网站文件夹

如何使用php验证图像格式

PHP从文件夹中提取随机图像

如何从 MAMP 服务器添加图像 php 文件

带有 php 扩展名的动态图像文件