現在、e コマース サイトを構築しています (Drupal Commerce を使用)。オーダーメイドのスポーツウェアを販売しています。顧客は、スタイル、2 つの色、およびサイズを選択できます。各スタイルには、300 を超える色の組み合わせから選択できます。
イラストレーターで商品のアートワークを作成しています。これらは、2 つの単色のみを使用し、上部に黒のアウトラインを配置した、非常に単純なベクトルです。
各スタイルのすべての色の組み合わせを、できれば動的に生成する方法を見つけようとしています。私はGDを見てきましたが、ここでうまくいくかどうかはわかりません。SVG を使用する方法 (既にベクターがあるため) か、カラー オーバーレイを適用して透明度を維持できる 3 つの透明な PNG をスタックする方法があるかどうか疑問に思いました。 終わり。
画像を動的に作成するために、白い背景と純粋な赤と純粋な青の領域を含む 1 つの GIF を作成して、プライマリ領域とセカンダリ領域を定義しました。これは、赤と青をユーザーが選択した色に変更する GD を介して実行されます。次に、黒いアウトラインと会社のロゴを含む透明な PNG が上部にマージされます。
index.php には、ユーザーがスタイルと 2 つの色を選択できるフォームがあります。
<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>
フォームが送信された後、オプションを product-image.php に渡す URL を作成するための 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; ?>">
その後、作業の大部分は 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 を調べたことがなかったので、この結果にはかなり満足しています。ここに大まかなデモを投稿しました(そのページで使用されているすべてのファイルをダウンロードするためのリンクもあります)。
改善のための提案はありますか?最終的に、ユーザーがドロップダウンで 2 つの色を選択するようにすると、スクリプトはそれらのオプションを持つ画像が存在するかどうかを確認し、存在しない場合は 2 つの領域の色を設定して動的に作成し、新しく作成した画像を保存します。将来のユーザーのために。
送信ボタンを使わずに自動更新するにはどうすればよいですか?