【问题标题】:Crop cirlcle image and merge with a marker with transparent bg裁剪圆形图像并与具有透明背景的标记合并
【发布时间】:2015-12-20 10:42:30
【问题描述】:

我正在尝试裁剪方形图像并将其与标记合并,但无法使裁剪后的圆形图像透明。

当将圆形图像另存为 PNG 时,它显示它带有透明角,但是当我在 Photoshop 中打开它时,它的角上有一个白色,如下面的最终图像。

这是我使用的代码:

//SAVED THE CIRCLE PNG IMAGE
            $width = 320;
            $height = 320;
            $img1 = '';
            switch($fileExt){
                case '.png':
                    $img1 = ImageCreateFrompng($img= $image_config['new_image']);
                break;
                case '.jpg':
                    $img1 = ImageCreateFromjpeg($img= $image_config['new_image']);
                break;
                case '.gif':
                    $img1 = ImageCreateFromgif($img= $image_config['new_image']);
                break;
            }
            $x=$width ;
            $y=$height;
            $img2 = imagecreatetruecolor($x, $y);
            $bg = imagecolorallocate($img2, 255, 255, 255); 
            imagefill($img2, 0, 0, $bg);
            $e = imagecolorallocate($img2, 0, 0, 0);
            $r = $x <= $y ? $x : $y;
            imagefilledellipse ($img2, ($x/2), ($y/2), $r, $r, $e); 
            imagecolortransparent($img2, $e);
            imagecopymerge($img1, $img2, 0, 0, 0, 0, $x, $y, 100);
            imagecolortransparent($img1, $bg);
            header("Content-type: image/png"); 
            imagepng($img1, './img/deviceImg/pin'.$datetime.'.png');
            imagedestroy($img2); // kill mask first
            imagedestroy($img1); // kill canvas last

            //MERGING IT WITH THE PIN
            $width = 320;
            $height = 320;
            $image_1 = imagecreatefrompng('./img/deviceImg/pin.png');
            imagesavealpha($image_1, true);
            imagealphablending($image_1, true);
            $image_2 = imagecreatefrompng('./img/deviceImg/pin'.$datetime.'.png');
            imagesavealpha($image_2, true);
            imagealphablending($image_2, true);

            imagecopy($image_1, $image_2, 40, 22, 0, 0, $width, $height);
            imagepng($image_1, './img/deviceImg/pinASD'.$datetime.'.png');

【问题讨论】:

    标签: php png gd alpha-transparency php-gd


    【解决方案1】:

    仅使用imagecopymerge() 复制透明度,而不是imagecopy()。所以你的倒数第二行:

    imagecopy($image_1, $image_2, 40, 22, 0, 0, $width, $height);
    

    应改为:

    imagecopymerge($image_1, $image_2, 40, 22, 0, 0, $width, $height, 100);
    

    注意末尾的额外参数(pct)。根据手册:

    两个图像将根据 pct 进行合并,范围从 0 到 100。当 pct = 0 时,不执行任何操作,当 pct = 0 时,此函数的行为与用于调色板图像的 imagecopy() 相同,除了忽略 alpha 分量,同时它实现了真彩色图像的 alpha 透明度。

    【讨论】:

    • 你说的完全正确,我改天尝试了这个案例,但由于某种原因没有工作,但现在非常感谢
    猜你喜欢
    • 1970-01-01
    • 2011-11-14
    • 1970-01-01
    • 2023-03-24
    • 1970-01-01
    • 2021-03-12
    • 2015-07-17
    • 2012-04-14
    • 2020-05-23
    相关资源
    最近更新 更多