我不知道这是什么,我试过才达到最佳的解决方案,但多次尝试和一些研究之后,我用了一个相当简单的方法来避免合并队列中的最后一张图像,用其相对较小的尺寸来掩盖其他图像。通过这种方式,每个图像都会根据用户需要在指定的画布大小内以其透明度合并和定位。
如果有人需要类似的解决方案,我会发布该函数的全部内容。这是一个类中的函数。
$images = array();
// Foreach loop to set images order and creating an array with image paths using params from $_GET before merging
foreach (scandir($this->img_dir) as $key => $dirname) {
if(!strstr($dirname, "."))
{
if(isset($_GET[$dirname]))
{
foreach ($this->layer_order as $lkey => $order) {
if($lkey == $dirname) {
$imageArray = glob($this->img_dir . "/" . $dirname . "/" . ($dirname == "door" && isset($_GET['type']) ? $_GET['type']."/" : "") . $_GET[$dirname] . ".png");
foreach ($imageArray as $imgPath) {
$images[$order] = $imgPath;
}
}
}
}
}
}
// Allocate new image
$destination = imagecreatetruecolor($this->canvas_width, $this->canvas_height);
imagealphablending($destination, false);
$col = imagecolorallocatealpha($destination, 255, 255, 255, 127);
imagefilledrectangle($destination, 0, 0, $this->canvas_width, $this->canvas_height, $col);
imagealphablending($destination, true);
// Sort order
ksort($images);
// Merging images
foreach($images as $key => $fn) {
// Load image
if(strstr($fn, "handle"))
{
$source = $this->resizePng($fn, 0.18, 100, 205);
imagecopy($destination, $source, 0, 0, 0, 0, $this->canvas_width, $this->canvas_height);
}
elseif (strstr($fn, "glass"))
{
// Create a background image by filling a canvas with small image tiles. Params: $file, $shrink_ratio_percent, $column_size, $stretch
$source = $this->multiplyMergeAndResizePngs($fn, 0.2095, 3, 3.6);
// Applying mask on images based on black and white patterns
if ($this->glass_mask)
$source = $this->createMask($source, $this->glass_mask);
imagecopy($destination, $source, 118, 28, 0, 0, $this->canvas_width, $this->canvas_height);
}
elseif (strstr($fn, "door"))
{
$source = imagecreatefrompng($fn);
imagecopy($destination, $source, 32, 0, 0, 0, $this->canvas_width, $this->canvas_height);
} else {
$source = imagecreatefrompng($fn);
imagecopy($destination, $source, 0, 0, 0, 0, $this->canvas_width, $this->canvas_height);
}
imagealphablending($destination, true);
// Free memory
imagedestroy($source);
}
return $destination;