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

Php 合并两个映像的最快方法:服务器,php,python,image,Php,Python,Image,我正在制作一个电子商务网站,通过合并两个或多个.png图像来创建产品的图像,并从中创建一个.jpg图像是我的主要问题 一个产品将有四个不同角度的图像 我必须通过两个图像的所有组合创建4*2=8个图像(如果产品是通过合并两个产品创建的) 问题是,若新产品是三个产品的合并,那个么总计4*3=12 快速生成这些图像并在页面加载时立即显示它们肯定需要时间 我想知道我应该使用什么: PHP Node.js 蟒蛇 还是别的什么 或者另一种最快的方法我应该使用什么请指导(我正在使用php进行电子商务平台) 以

我正在制作一个电子商务网站,通过合并两个或多个.png图像来创建产品的图像,并从中创建一个.jpg图像是我的主要问题

  • 一个产品将有四个不同角度的图像
  • 我必须通过两个图像的所有组合创建4*2=8个图像(如果产品是通过合并两个产品创建的)
  • 问题是,若新产品是三个产品的合并,那个么总计4*3=12

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

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

  • PHP
  • Node.js
  • 蟒蛇
  • 还是别的什么
  • 或者另一种最快的方法我应该使用什么请指导(我正在使用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

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

  • 存储映像的磁盘类型—机械磁盘、RAID、SSD、RAM磁盘

  • 存储图像的格式—例如PNG、JPEG或ImageMagick MPC

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

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

  • 您实际如何实现您的处理

  • 我做了一些实验,创建了1000幅图像,每幅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
    
    <?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');
    ?>
    
    <?php
       $img1=new Imagick("image1.png");
       $img2=new Imagick("image2.png");
       $img1->compositeImage($img2,imagick::COMPOSITE_ATOP,0,0);
       $img1->writeImage('out.jpg'); 
    ?>
    
    以下是1000个复合材料的结果

    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时间好多少,所以大量的处理时间可能是创建1000个进程来进行合成

    。。。这就引出了我的下一点,即您创建的进程数。如果您可以在一个流程中完成所有处理,那么这可能是有益的,因此,与其执行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的
    GD
    库这样做:

    #!/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
    
    <?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');
    ?>
    
    <?php
       $img1=new Imagick("image1.png");
       $img2=new Imagick("image2.png");
       $img1->compositeImage($img2,imagick::COMPOSITE_ATOP,0,0);
       $img1->writeImage('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');
    ?>
    
    #/usr/local/bin/php-f
    
    也可以在PHP中使用ImageMagick,如下所示:

    #!/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
    
    <?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');
    ?>
    
    <?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秒。

    向我们展示开始图像和结果图像如何?你有多少张图片?你能预先创建所有的组合并存储它们吗?显示起始图片??可能是婴儿图像+不同背景主题图像让我们继续使用婴儿示例。客户端X访问您的网站,您有4张客户端X的宝宝从不同角度看的照片(大概是在透明背景上),您有3个不同的背景,您希望将4个视图中的每一个视图与3个背景中的每一个视图合成,并生成12张图像。对的您的图像大小是多少,即2000像素乘以1200像素,大小以kB为单位,它们是PNG还是JPEG?更新的qsn或也可以尝试您的案例。告诉我什么应该是更好的处理方法。所以,每个图像只使用一次,对吗?我的意思是
    表X水平视图
    仅出现在单个输出图像中。谢谢,我也会喜欢它的深入分析。你可以根据我的情况提供其他答案吗?谢谢你,我应该用php还是其他语言,因为速度是最重要的,你喜欢什么都行!我怀疑GD或ImageMagick是大多数人会采用的方式,但请尝试任何您喜欢的方式。我尝试了您的GD解决方案,我制作了黑色背景的图像。为什么我(两次)询问您的图像的原因:-)我没有意识到您需要白色背景,因此我修改了代码以生成该背景。请再看一看。