【问题标题】:How can you use PHP GD imagecrop on a PNG whilst maintaining transparency?如何在保持透明度的同时在 PNG 上使用 PHP GD 图像裁剪?
【发布时间】:2016-07-04 01:42:00
【问题描述】:

每当我在具有透明度的 PNG 上调用 PHP GD 的 imagecrop() 时,它会将透明部分变为黑色而不是保持它。

我最近编写了一个函数来缩放透明 PNG,同时保持透明度(见下文),所以我了解使用 imagecopyresampled 等。

function scale_png($image, $resize_w = FALSE, $resize_h = FALSE, $alpha = 127)
{
    $src_w = imagesx($image);
    $src_h = imagesy($image);
    if (! $resize_w) {$resize_w = $src_w;}
    if (! $resize_h) {$resize_h = $src_h;}
    $output = imagecreatetruecolor($resize_w, $resize_h);
    imagealphablending($output, FALSE);
    imagesavealpha($output, TRUE);
    $transparent = imagecolorallocatealpha($output, 255, 255, 255, $alpha);
    imagefilledrectangle($output, 0, 0, $resize_w, $resize_h, $transparent);
    imagecopyresampled($output, $image, 0, 0, 0, 0, $resize_w, $resize_h, $src_w, $src_h);

    return $output;
}

上面的这个函数工作正常,但是当我也尝试在同一个 PNG 上执行 imagecrop() 时,这是我得到黑色背景的时候。

有什么简单的方法可以成功地进行这种裁剪吗?我似乎找不到任何好的例子。

如果可能的话,我宁愿不必编写另一个像上面那样的复杂函数来使用 x、y、w、h 和 imagecopyresampled() 裁剪图像,因为这是一个主要的球痛。

那里有任何 GD 研究人员愿意将他们宝贵的知识传授给我吗?

【问题讨论】:

  • @cmorrissey 我的问题是是否有办法在不编写函数的情况下做到这一点,如果没有,那么该函数可能是什么样子。但是,当这实际上是一个合法的问题时,感谢您的完全无用的评论和投反对票。
  • 我们没有听说要为您编写代码,如果您的代码有错误,我们可以提供帮助。你有一个调整大小函数的例子,修改它来裁剪图像很简单,你也可以谷歌这个,你会得到 100 种不同的资源。
  • @cmorrissey 显然这对我来说不是微不足道的,或者我已经完成了......可能比我写这篇文章的时间还短。

标签: php image png transparency crop


【解决方案1】:

据我所知,这里没有什么复杂的,您必须在执行裁剪之前保存 Alpha 通道。

$img = imagecreatefrompng("./cover.png");
imagealphablending($img, false);
imagesavealpha($img, true);
$resource = imagecrop($img, ['x' => 0, 'y' => 0, 'width' => 500, 'height' => 500]);

【讨论】:

    【解决方案2】:

    确保您拥有 GD 库。 然后执行以下操作:

       $img = imagecreatefrompng("./sample.png");
        imagealphablending($img, false);//set alphablending to false
        $img=imagecrop($img, array('x' => 0, 'y' =>0, 'width' => 200, 'height' => 200));
        imagesavealpha($img, true);//save alpha after croping
    

    【讨论】:

    • 此答案不会从之前发布的其他答案中添加任何新内容。
    • @tomerpacific 在 imagecrop() 函数保存透明度后执行 imagesavealpha($img, true)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 1970-01-01
    • 2015-07-17
    • 2013-03-17
    • 2011-11-11
    • 1970-01-01
    • 2012-06-04
    相关资源
    最近更新 更多