合并两个图像的最快方法:服务器

时间:2014-12-05 07:57:06

标签: php python image

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

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

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

    我想知道我应该使用什么:

    1. PHP
    2. Node.js的
    3. 的Python
    4. 或别的什么
    5. 或其他最快的方式这样做我应该使用请指导(我使用php进行电子商务平台)

      以下是示例示例: 1:表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

2 个答案:

答案 0 :(得分:2)

这个问题有很多方面,我不会假装全部覆盖它们。一些变量是:

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

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

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

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

  5. 您实际如何实施处理

  6. 我做了一些实验并创建了1,000张图像,每张512x512像素。我在RAID,SSD和RAM磁盘上创建了这些。我将它们创建为PNG格式和ImageMagick MPC(Magic Pixel Cache)格式。然后我成对地读取它们进行合成,即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种复合材料的结果

    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 \)
                                        ...     
    

    注意:

    现在你已经更新了你的问题,这个答案中的一些变得无关紧要,但是当我花时间写这篇文章时,我会留下它作为参考。

答案 1 :(得分:1)

你可以使用PHP的GD库这样做:

<?php
$image1=imagecreatefrompng('image1.png');
$image2=imagecreatefrompng('image2.png');
$w=imagesx($image1);
$h=imagesy($image1);
imagecopy($image1,$image2,0,0,0,0,$w,$h);
imagejpeg($image1,'out.jpg');
?>

或者,如果您想要在白色背景上拍摄图像,您可能更喜欢这样:

#!/usr/local/bin/php -f
<?php

// Read in both images
$image1=imagecreatefrompng('image1.png');
$image2=imagecreatefrompng('image2.png');

// Get their dimensions
$w=imagesx($image1);
$h=imagesy($image1);

// Now create a blank canvas on which to overlay the images
$bg=imagecreatetruecolor($w,$h);

// Fill the background with white
$bgcolor=imagecolorallocate($bg,255,255,255);
imagefilledrectangle($bg,0,0,$w,$h,$bgcolor);

// Now copy the two images over the background
imagecopy($bg,$image1,0,0,0,0,$w,$h);
imagecopy($bg,$image2,0,0,0,0,$w,$h);
imagejpeg($bg,'out.jpg');
?>

或者您可以在PHP中使用ImageMagick,如下所示:

<?php
   $img1=new Imagick("image1.png");
   $img2=new Imagick("image2.png");
   $img1->compositeImage($img2,imagick::COMPOSITE_ATOP,0,0);
   $img1->writeImage('out.jpg'); 
?>

我的iMac上的GD版本明显更快,它可以在18秒内完成1000次迭代,而ImageMagick版本需要36秒才能获得相同数量的图像。