В настоящее время я создаю сайт электронной коммерции (с Drupal Commerce). Мы продаем спортивную одежду, которая производится на заказ. Клиент может выбрать стиль, два цвета и размер. Для каждого стиля есть более трехсот комбинаций цветов, которые можно выбрать.Как я могу генерировать два цветных изображения продукта динамически?
Я создаю иллюстрацию для продуктов в Illustrator. Это довольно простые векторы, которые используют только два плоских цвета с черным контуром сверху.
Я пытаюсь найти способ создания всех цветовых комбинаций для каждого стиля, желательно динамически. Я посмотрел на GD, но я не уверен, что это сработает. Я задавался вопросом, есть ли способ использовать SVG (так как у меня уже есть векторы) или укладка трех прозрачных PNG, которые могут иметь наложенную цветовую накладку и сохранять прозрачность?
Выполнено.
Чтобы создать изображения динамически, я создал один GIF, содержащий белый фон и чистую красную и чистую синюю область для определения первичной и вторичной областей. Это выполняется через GD, который изменяет красный и синий цвета на выбранные пользователем цвета. Затем прозрачный PNG объединяется сверху, который содержит черный контур и логотип компании.
На index.php У меня есть форма, которая позволяет пользователям выбирать стиль и два цвета:
<form method="post" action="index.php">
<label for="style">Style:</label>
<select id="style" name="style" required>
<option value="0001">Vertical Stripe</option>
<option value="0002">V Neck</option>
<option value="0003">Contrast Side</option>
...
</select>
<br><br>
<label for="color1">Color 1:</label>
<select id="color1" name="color1" required>
<option></option>
<option value="134,84,66">Retro Brown</option>
<option value="115,51,68">Claret</option>
<option value="167,57,52">Deep Red</option>
<option value="213,69,54">Bright Red</option>
...
</select>
...
</form>
После того, как форма была отправлена, есть некоторые PHP для создания URL, который проходит опции к продукту -image.php:
<?php
$url = "product-image.php";
if (isset($_POST["style"])) {
$url = $url . "?style=" . $_POST["style"];
}
if (isset($_POST["color1"])) {
$url = $url . "&color1=" . $_POST["color1"];
}
if (isset($_POST["color2"])) {
$url = $url . "&color2=" . $_POST["color2"];
}
?>
<img class="product" src="<?php echo $url; ?>">
Тогда основная часть работы выполняется продукт-image.php:
// Set some dummy values to avoid errors
$style = "0001";
$color1 = array(255,255,0);
$color2 = array(0,0,200);
if (isset($_GET["style"])) {
$style = $_GET["style"];
}
$colorFile = $style . "colors.gif";
$outlineFile = $style . "outline.png";
// Load image with coloured sections
$image_1 = imagecreatefromgif($colorFile);
// Load image with outlines
$image_2 = imagecreatefrompng($outlineFile);
imagealphablending($image_1, true);
imagesavealpha($image_1, true);
imagetruecolortopalette($image_1, false, 255);
// Import $color1 values to create an RGB array
if (isset($_GET["color1"])) {
$color1 = explode(',', $_GET["color1"]);
}
// Import $color2 values to create an RGB array
if (isset($_GET["color2"])) {
$color2 = explode(',', $_GET["color2"]);
}
// Define Primary (red) region
$region1 = imagecolorclosest ($image_1, 255,0,0);
// Set new colour for $region1 using the values passed into $color1
imagecolorset($image_1, $region1, $color1[0], $color1[1], $color1[2]);
// Get Secondary (blue) region
$region2 = imagecolorclosest ($image_1, 0,0,255);
// Set new colour for $region2 using the values passed into $color2
imagecolorset($image_1, $region2, $color2[0], $color2[1], $color2[2]);
// Create a true color canvas, this seems to retain transparency when merging PNG & GIF
$merged_image = imagecreatetruecolor(339, 390);
// Merge the newly coloured sections
imagecopy($merged_image, $image_1, 0, 0, 0, 0, 339, 390);
// Merge the outlines on top
imagecopy($merged_image, $image_2, 0, 0, 0, 0, 339, 390);
// Tell browser to expect PNG
header("Content-type: image/png");
// Output new PNG
imagepng($merged_image);
// Tidy up
imagedestroy($image_1);
imagedestroy($image_2);
imagedestroy($merged_image);
Я довольно запутался в результатах, так как я все еще изучаю PHP и никогда раньше не смотрел в GD. Я разместил rough demo here (есть также ссылка для загрузки всех файлов, используемых на этой странице).
Любые предложения по улучшению? В конечном счете, я хочу, чтобы пользователь выбирал два цвета в раскрывающихся списках, а затем сценарий будет смотреть, существует ли изображение с этими параметрами, и если оно не динамически создает его, задавая цвет двух регионов, а затем сохраняет вновь созданное изображение для будущих пользователей.
Как сделать автоматическое обновление без необходимости кнопки отправки?
На каких языках вы можете использовать? – Jacob
Я хотел бы придерживаться php и javascript, если это возможно. – ianw
Я обновил сообщение с помощью некоторого примера кода. У меня есть изменение цвета, работающее с GIF, но, похоже, оно терпит неудачу, если я пытаюсь использовать PNG. Я думаю, что я получаю более чистые результаты, используя два изображения. Одна из двух плоских цветных областей, а затем прозрачная схема слилась после применения цветов. – ianw