【问题标题】:PHP: transparent area in PNGPHP:PNG中的透明区域
【发布时间】:2012-06-20 18:33:11
【问题描述】:

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

【问题讨论】:

  • 你的意思是你得到的图像有透明孔?如果是,那可能是浏览器的问题..您使用的是哪一个?
  • 不,我的意思是我获得的图像包含 rgb(255,1,254) 填充矩形而不是透明矩形区域。无论如何,我刚刚找到了这个问题的答案。我正在使用 imagecopy() 将 png 复制到背景上。并且仅使用 imagecopymerge() 复制透明度。应该更仔细地阅读文档。
  • 好!玩透明胶片:D

标签: php gd


【解决方案1】:

试试这个透明色:

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

【讨论】:

    【解决方案2】:

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

    可以通过设置Imagick::newImage函数的背景参数来创建矩形,使用ImagickDraw::circle函数的cicle,关键是使用Imagick::compositeImageonly copying the transparency来套圈。这将阻止您获得顶部带有透明圆圈的实心图像;蒙版中透明的所有内容在原始图像上都是透明的。

    下面的代码应该可以解决问题(尽管我确信它需要一些调整才能满足您的需求: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,我碰巧遇到了同样的问题,你能告诉我你的答案吗? ImageickDraw 将是我想尝试的最后一种方式。
    • @anna,您应该使用原始帖子中的代码来创建“蒙版”(具有透明区域的图像)。根据您的需要,也许可以使用其他函数而不是 imagefilledrectangle() 。然后你应该使用 imagecopymerge() (不是 imagecopy() )将“掩码”复制到背景图像上。就是这样。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-28
    • 1970-01-01
    • 2013-08-04
    • 2013-01-02
    • 1970-01-01
    相关资源
    最近更新 更多