PHP:PNG中的透明区域

时间:2012-06-18 18:24:49

标签: php gd

我想在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图像放在其他图像的顶部时,该区域会失去透明度,因此我最终会在结果图像的中间显示彩色矩形。有人可以帮助我吗?

2 个答案:

答案 0 :(得分:1)

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

您可以通过设置Imagick::newImage函数的背景参数,使用ImagickDraw::circle函数设置cicle来创建矩形,关键是使用Imagick::compositeImage和{来应用圆圈{3}}结束。这样可以防止您在顶部有一个带透明圆圈的实心图像;掩模中透明的所有内容在原始图像上都是透明的。

以下代码应该可以解决问题(虽然我确信它需要一些调整才能满足您的需求: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;

?>

答案 1 :(得分:0)

尝试使用透明色:

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