php - 合并两个图像的最快方法: server

标签 php python image

enter image description here我正在制作电子商务网站,其中产品图像实际上是通过合并两个或多个 .png 图像来创建的,并从中创建 .jpg 图像是我的主要问题。

  1. 产品将有四个不同角度的图像
  2. 我必须通过两个图像的所有组合创建 4*2 = 8 个图像(如果产品是通过合并两个产品创建的)

问题是,如果新产品是三个的合并,那么总共 4*3=12

快速生成这些图像并在页面加载后立即显示它们肯定需要时间

我想知道我应该用什么来实现:

  1. PHP
  2. Node.js
  3. Python
  4. 或者其他东西

或者另一种最快的方法,我应该使用什么,请指导(我正在使用 php 进行电子商务平台)

下面是示例: 1: table X 和椅子 Y 有4个不同的角度

(transparent png + transparent png) = Combined image (in jpg)

X Horizontal view + Y Horizontal view = Combined image (in jpg)
X Top view + Y Top view = Combined image (in jpg)
X 45 deg view + Y 45 deg view = Combined image (in jpg)
X 90 deg view + Y 90 deg view = Combined image (in jpg)

每个大小为 800px * 800px,大约 300-400kb

最佳答案

这个问题有很多方面,我不会假装涵盖所有方面。一些变量是:

  1. 存储镜像的磁盘类型 - 机械磁盘、RAID、SSD、RAMdisk

  2. 存储图像的格式 - 例如 PNG、JPEG 或 ImageMagick MPC

  3. 您使用什么库/软件 - GD、ImageMagick 或其他

  4. 是否使用多核/多线程/分布式方法

  5. 如何实际实现处理

我做了一些实验并创建了 1,000 张图像,每张图像为 512x512 像素。我在 RAID、SSD 和 RAM 磁盘上创建了这些。我将它们创建为 PNG 格式和 ImageMagick MPC(魔法像素缓存)格式。然后我成对读取它们进行合成,即 image0 和 image999,然后 image1 和 image998,image2 和 image997 ...

代码是这样的:

#!/bin/bash
rm *.png *.mpc *.cache
for extension in png mpc; do
   echo Testing $extension
   # Create 1,000 input files
   for i in {0..999}; do convert -size 512x512 xc: +noise random $i.$extension ;done

   # Read the files in pairwise for processing, 0 with 999, 1 with 998, 2 with 997
   time for i in {0..999}; do j=$((999-i)) ;convert $i.$extension $j.$extension null:;done 

   rm *.png *.mpc *.cache
done

以下是 1,000 种复合 Material 的结果

RAID disk, PNG format: 43 seconds
RAID disk, MPC format: 6.9 seconds

SSD disk, PNG format: 33 seconds
SSD disk, MPC format: 6.1 seconds

RAM disk, PNG format: 30 seconds
RAM disk, MPC format: 6.0 seconds

我推断使用 ImageMagick 时以 MPC 格式存储图像有显着的好处。我还注意到 RAM 磁盘时间并不比 SSD 时间好多少,因此大量的处理时间可能是创建 1,000 个进程来进行合成......

...这让我想到了下一点,即您创建的进程数量。如果您可以在单个进程中完成所有处理,那么这可能会很有帮助,而不是执行 12 个进程:

composite view1 with background1
composite view1 with background2
composite view2 with background1
composite view2 with background2
composite view3 with background1
composite view3 with background2
composite view4 with background1
composite view4 with background2
...

你应该尝试这样做

load view1..4 background1..2, composite v1 b1 +write, composite v1 b2 + write, composite v1 b1  +write

这在 ImageMagick 中很容易完成

convert view{1..4} background{1..2} \( -clone 0,4 -composite +write v1b1.jpg \)
                                    \( -clone 0,5 -composite +write v1b2.jpg \)
                                    ...     

注意:

现在你已经更新了你的问题,这个答案中的一些内容变得无关紧要,但由于我花了时间写它,我将把它留下来供引用。

关于php - 合并两个图像的最快方法: server,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27311326/

相关文章:

php - 必须有一种更有效的方法来做到这一点

php - 处理“openssl 扩展丢失 : in XAMPP

php - 如何获取使用 fopen 打开的文件中的当前行?

python - 我如何知道我是否正在调用 numpy.array() 还是使用内置数组函数?

php - PHP套接字不监听

python - numpy.savez 和 numpy.savez_compressed 使用 pickle 吗?

c# - 在我的服务器上发布帖子的 C# 线程 - Flood

java - 如何使用 LWJGL 将 BufferedImage 绘制到屏幕上?

c# - 如何用C#让图像平滑移动

python - 调整图像大小时解码器 JPEG 错误