Мне было предложено перенести приложение Python на PHP (и я не очень люблю PHP).
В части, которую у меня возникли проблемы с портфолио, используется набор монохромных «шаблонных» изображений на основе замечательной коллекции карт Icons от Nicolas Mollet . Эти шаблонные изображения используются для создания значка с пользовательскими цветами фона и переднего плана. PIL's Image.paste используется для «вставки» значка переднего плана с выбранным цветом с использованием шаблона Image в качестве альфа-маски. Например:
Как я могу воспроизвести это в PHP? Есть ли альтернатива, кроме того, что она занимает пиксель за пикселем?
[Обновить]
Я не горжусь своими навыками PHP … Что у меня до сих пор:
<?php header('Content-type: image/png'); // read parameters: icon file, foreground and background colors $bgc = sscanf(empty($_GET['bg']) ? 'FFFFFF' : $_GET['bg'], '%2x%2x%2x'); $fgc = sscanf(empty($_GET['fg']) ? '000000' : $_GET['fg'], '%2x%2x%2x'); $icon = empty($_GET['icon']) ? 'base.png' : $_GET['icon']; // read image information from template files $shadow = imagecreatefrompng("../static/img/marker/shadow.png"); $bg = imagecreatefrompng("../static/img/marker/bg.png"); $fg = imagecreatefrompng("../static/img/marker/" . $icon); $base = imagecreatefrompng("../static/img/marker/base.png"); imagesavealpha($base, true); // for the "shadow" // loop over every pixel for($x=0; $x<imagesx($base); $x++) { for($y=0; $y<imagesy($base); $y++) { $color = imagecolorsforindex($bg, imagecolorat($bg, $x, $y)); // templates are grayscale, any channel serves as alpha $alpha = ($color['red'] >> 1) ^ 127; // 127=transparent, 0=opaque. if($alpha != 127) { // if not 100% transparent imagesetpixel($base, $x, $y, imagecolorallocatealpha($base, $bgc[0], $bgc[1], $bgc[2], $alpha)); } // repeat for foreground and shadow with foreground color foreach(array($shadow, $fg) as $im) { $color = imagecolorsforindex($im, imagecolorat($im, $x, $y)); $alpha = ($color['red'] >> 1) ^ 127; if($alpha != 127) { imagesetpixel($base, $x, $y, imagecolorallocatealpha($base, $fgc[0], $fgc[1], $fgc[2], $alpha)); } } } } // spit image imagepng($base); // destroy resources foreach(array($shadow, $fg, $base, $bg) as $im) { imagedestroy($im); } ?>
Он работает, и производительность неплохая.
Согласно моим комментариям, ImageMagick сможет это сделать. Однако вы указали, что это может быть не оптимальным для вашего варианта использования, поэтому рассмотрите возможность использования GD2. Есть демонстрация того, как сделать слияние изображений на сайте PHP.
Я бы предположил, что это можно сделать на любой (довольно недавней) установке PHP по умолчанию.