我目前正在构建一个电子商务网站(使用 Drupal Commerce)。我们销售定制的运动服装。客户可以选择一种款式、两种颜色和一种尺寸。对于每种样式,有超过三百种颜色组合可供选择。
我正在为 Illustrator 中的产品创建图稿。它们是相当简单的向量,仅使用两种平面颜色,顶部有黑色轮廓。
我正在尝试找到一种方法来为每种样式生成所有颜色组合,最好是动态生成。我看过GD,但我不确定这会在这里奏效。我想知道是否有一种方法可以使用 SVG(因为我已经有了矢量)或堆叠 3 个可以应用颜色叠加并保持透明度的透明 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 来创建一个将选项传递给 product-image.php 的 URL:
<?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; ?>">
然后大部分工作由 product-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。我在这里发布了一个粗略的演示(还有一个链接可以下载该页面上使用的所有文件)。
有什么改进建议吗?最终,我希望用户在下拉列表中选择两种颜色,然后脚本将查看是否存在具有这些选项的图像,如果不存在,则通过设置两个区域的颜色动态创建它,然后存储新创建的图像对于未来的用户。
如何在不需要提交按钮的情况下使其自动更新?