PHP:PNG 中的透明区域

4

我希望在一个png图片中创建一个透明区域,类似于“洞”。这样,我就可以将这个图片放在一些背景图片的上面,并通过这个“洞”看到背景的一部分。我在某个论坛上找到了以下代码:

$imgPath = 'before.png';
$img = imagecreatefrompng($imgPath); // load the image
list($width,$height) = getimagesize($imgPath); // get its size
$c = imagecolortransparent($img,imagecolorallocate($img,255,1,254)); // create transparent color, (255,1,254) is a color that won't likely occur in your image
$border = 10;
imagefilledrectangle($img, $border, $border, $width-$border, $height-$border, $c); // draw transparent box
imagepng($img,'after.png'); // save

它可用于创建png图像中的透明区域(在这种情况下是矩形)。但是,当我将此png图像放在其他图像的顶部时,该区域失去了透明度,因此我最终得到了结果图像中央的彩色矩形。请问有谁可以帮助我吗?


1
你的意思是你获得的图像有透明的洞吗?如果是的话,可能是浏览器的问题...你用的是哪一个浏览器? - Erenor Paz
不,我的意思是我获取的图像包含填充为rgb(255,1,254)的矩形,而不是透明的矩形区域。无论如何,我刚刚找到了解决这个问题的答案。我使用imagecopy()将png复制到背景上。只有使用imagecopymerge()才能复制透明度。应该更仔细地阅读文档。 - palehorse
好的!享受透明度的乐趣吧 :D - Erenor Paz
2个回答

1

另一种选择是使用PHP ImageMagick扩展Imagick

您可以通过设置Imagick :: newImage函数的背景参数来创建矩形,使用ImagickDraw :: circle函数创建圆形,关键是使用Imagick :: compositeImage仅复制透明度应用圆形。这将防止您在顶部具有透明圆的实心图像;掩码中透明的所有内容在原始图像上都是透明的。

下面的代码应该可以解决问题(尽管我确定它需要进行一些调整以满足您的需求:P):

<?php

    $base = new Imagick("before.png");
    $base->cropImage(512, 512, 0, 0);
    $base->setImageMatte(true);

    $mask = new Imagick();
    $mask->newImage(512, 512, new ImagickPixel("transparent"));

    $circle = new ImagickDraw();
    $circle->setFillColor("black");
    $circle->circle(150, 150, 100, 100);

    $mask->drawImage($circle);

    $base->compositeImage($mask, Imagick::COMPOSITE_COPYOPACITY, 0, 0);

    $base->writeImage('after.png');
    header("Content-Type: image/png");
    echo $base;

?>

谢谢。事实上,我已经找到了我的问题的答案,但我会记住这个。 - palehorse
@palehorse,我碰巧有同样的问题,你能告诉我你的答案吗?ImageickDraw将是我想尝试的最后一种方法。 - anna
@anna,你应该使用原始帖子中的代码来创建“掩码”(具有透明区域的图像)。根据您的需求,可以使用一些其他函数而不是imagefilledrectangle()。然后,您应该使用imagecopymerge()(而不是imagecopy())将“掩码”复制到背景图像上。就这样。 - palehorse

0

尝试使用以下代码实现透明颜色:

$c = imagecolorallocatealpha($img,0,0,0,127);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接