php gd пишет изображение поверх других изображений png

Я пытаюсь реализовать функцию, которая рисует изображение поверх другого изображения.
я всегда получаю второе изображение выше с черным фоном вот код, который я использую

function writeImageOnImage($canvasImage, $x, $y, $drawnImage, $multiplyer = 1, $dynamicProperotions = false){
if(is_resource($canvasImage)){
$canvasImage = $canvasImage;
}else{
$canvasImage = imagecreatefrompng($canvasImage);
}
$drawnImageResource = imagecreatefrompng($drawnImage, true);
$drawnImageResource = $drawnImageResource['image'];
//imagecolortransparent($drawnImageResource, imagecolorallocate($drawnImageResource, 255, 255, 255));
if($dynamicProperotions){
$width = imagesx($drawnImageResource);
$height = imagesy($drawnImageResource);
if($multiplyer > 1){
$width /= $multiplyer;
$height /= $multiplyer;
}
}else{
$width = 20;
$height = 20;
}
imagealphablending($canvasImage, false);
imagesavealpha($canvasImage, true);
//imagecolorallocatealpha($canvasImage, 0, 0, 0, 127);
imagecopy($canvasImage, $drawnImageResource, $x*$multiplyer, $y*$multiplyer, 0, 0, $width*$multiplyer, $height*$multiplyer);
imagedestroy($drawnImageResource);
return $canvasImage;
}

вот как я вызываю эту функцию

writeImageOnImage("test.png", 100, 100, "checkSign.png", 1, true);

«checkSign.png» создается из вывода пользовательского HTML-холста (который дает вывод SVG).
Я конвертирую изображение SVG в PNG, используя Imagick и этот код:

function createSvgImage($data, $maxWidth, $maxHeight, $fileName){
global $configuration;
$result = array();
$result["file"] = $fileName;
$data = str_replace("data:image/svg+xml;base64", "", $data);
$data = str_replace(" ", "+", $data);
$data = base64_decode($data);
$data = str_replace('stroke="#000000"', 'stroke="#004fca"', $data);
$xml = simplexml_load_string($data);
$attr = $xml->attributes();
$size = [$maxWidth, $maxHeight];
$widthRatio = intval($attr->width) / $size[0];
$heightRatio = intval($attr->height) / $size[1];
$image = new \Imagick();
$image->setBackgroundColor(new \ImagickPixel('transparent'));
if($widthRatio > $heightRatio){
$image->setResolution(72 * ($size[0] / intval($attr->width)),72*((intval($attr->height)*$widthRatio) / intval($attr->height)));
$image->readimageblob($data);
$image->scaleImage($maxWidth,floatval($attr->height)/$widthRatio);
$result['width'] = $maxWidth;
$result['height'] = floatval($attr->height)/$widthRatio;
}else{
$image->setResolution(72*((intval($attr->width)*$heightRatio) / intval($attr->width)),72 * ($size[1] / intval($attr->height)));
$image->readimageblob($data);
$image->scaleImage(floatval($attr->width)/$heightRatio, $maxHeight);
$result['width'] = floatval($attr->width)/$heightRatio;
$result['height'] = $maxHeight;
}
$image->setimagetype(\Imagick::IMGTYPE_TRUECOLOR);
$image->setimageformat("png");
/*$image->setOption('png:color-type', 6);
$image->setOption('png:bit-depth', 8);*/
//$image->writeimage("png16:".$fileName);
$image->writeimage($fileName);
return $result;
}

и эта функция инициируется с помощью этого кода:

createCanvasImage($_POST['canvas'], 500, 500, "checkSign.png");

здесь выходное изображение я получаю

Заранее спасибо!

0

Решение

Задача ещё не решена.

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]