簡體   English   中英

如何使用PHP GD庫將具有不同大小的多個透明png合並到一張圖像中,而無需裁剪?

[英]How to merge multiple transparent pngs with different size into one image without cropping, using PHP GD library?

我想將具有透明背景的多個png合並到一張圖像中。 圖像具有不同的大小,因此,當將圖像放置在彼此的頂部時,僅在最上方圖像的大小內顯示合並圖像的部分。

就像最后一張圖像像蒙版一樣適用於之前合並的圖像。 我希望看到所有圖像以其原始大小合並,而不會裁切掉懸掛在最后一張圖像上的部分。

這是我當前正在使用的代碼:

$images = array();
    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)
                        $images[$order] = glob($this->img_dir . "/" . $dirname . "/" . $_GET[$dirname] . ".png");
                }
            }
        }
    }


    $destination = imagecreatetruecolor(458, 600);


    imagealphablending($destination, true);
    imagesavealpha($destination, true);

    ksort($images);
    foreach($images as $key => $value) {        
        foreach ($value as $fn) {
            // Load image
            $source = imagecreatefrompng($fn);
            //$source = $this->resize_image($source, 50, 50, 2);

            // Copy over image
            imagecopy($destination, $source, 10, 50, 0, 0, 458, 600);

            // Free memory
            imagedestroy($source);
        }
    }

    return $destination;

我不知道這是否是我嘗試達到的最佳解決方案,但是經過幾次嘗試和一些研究,我使用了一種相當簡單的方法來避免合並隊列中的最后一張圖像,用較小的尺寸遮蓋其他圖像。 這樣,每張圖像將被合並並根據用戶的需要在指定的畫布大小內以其透明性進行定位。

如果有人需要類似的解決方案,我會發布功能的全部內容。 這是一個類內部的函數。

    $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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM