2014-12-05 7 views
1

enter image description here Я делаю сайт электронной коммерции, где изображения продукта фактически создаются путем слияния двух или более изображений PNG и создания .jpg изображения, это моя главная проблема.Самый быстрый способ слить два изображения: сервер

  1. продукт будет иметь четыре изображения под разными углами
  2. Я должен создать 4 * 2 = 8 изображений всеми комбинациями двух изображений (если продукт создается путем объединения двух продукта)

Проблема заключается в том, что если новый продукт слияния трех, то всего 4 * 3 = 12

Генерация эти изображения быстро и отображать их, как только во время загрузки страниц, безусловно, потребуется время,

Я хочу знать, что я должен использовать для этого:

  1. PHP
  2. Node.js
  3. Python
  4. Или что-то другое

или другой быстрый способ сделать так, что должно я использую, пожалуйста, руководство (я использую 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

+1

Как насчет того, чтобы показывать нам исходные изображения и результирующие изображения? Сколько у вас изображений - можете ли вы предварительно создать все комбинации и сохранить их? –

+0

показать стартовые изображения ?? может быть образ ребенка + разные образы backgroudn темы – mydeve

+0

Итак, давайте продолжим использовать пример ребенка. Клиент X посещает ваш сайт, и у вас есть 4 фотографии ребенка клиента X, которые выглядят под разными углами (предположительно, на прозрачном фоне), и у вас есть 3 разных фона, и вы хотите комбинировать каждый из 4 видов с каждым из трех фонов и создавать 12 изображений. Верный? Каковы размеры ваших изображений, то есть 2000 пикселей на 1200 пикселей и какой размер в kB, и являются ли они PNG или JPEG? –

ответ

1

Вы можете сделать это с помощью GD библиотеки PHP, как это:

<?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'); 
?> 

Или вы можете использовать ImageMagick в PHP, например:

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

GD-версия значительно быстрее на мой iMac, он может сделать 1000 итераций за 18 секунд, тогда как для версии ImageMagick требуется 36 секунд для того же количества изображений.

+0

ok спасибо за те же . Должен ли я использовать php для этого или любого другого языка, поскольку скорость важна? – mydeve

+0

Используйте все, что угодно! Я подозреваю, что GD или ImageMagick - это то, как большинство людей пойдет, но попробуйте все, что вам нравится. –

+0

Я попробовал ваше решение gd, я делаю изображение с черным backgroudn, почему так – mydeve

2

Есть много аспектов этого вопроса, и я не буду делать вид, чтобы покрыть их все. Некоторые из переменных:

  1. Тип диска, на котором хранятся изображения - механический диск, RAID, SSD, RAMdisk

  2. Формат, в котором вы храните свои изображения - PNG, JPEG, или ImageMagick MPC, например

  3. Что библиотека/программное обеспечение вы используете - GD, ImageMagick или других

  4. используете ли вы многоядерные/многопоточные/распределенный подход

  5. Как вы на самом деле реализовать ваши обработки

Я сделал некоторые эксперименты и создали 1000 изображений, каждый 512x512 пикселей. Я создал их на RAID, на SSD и на RAM-диске. Я создал их как формат PNG, так и формат ImageMagick MPC (Magic Pixel Cache). Затем я читаю их попарно для компоновки, то есть image0 с изображением999, затем изображения1 и image998, image2 с изображением997 ...

Код выглядит так:

#!/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 

Вот результаты для 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 

вывожу есть существенное преимущество для сохранения изображений в формате MPC при использовании ImageMagick. Я также отмечаю, что время на диске 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 \) 
            ...  

Примечание:

Некоторые из этих ответов становятся неактуальными, теперь вы обновили свой вопрос, но поскольку я потратил время на это, я оставлю его для справки.

+0

спасибо, мне также понравится его глубокий анализ. может также предоставить другой ответ, основанный на моей ситуации. – mydeve

Смежные вопросы