【问题标题】:Imagick jpg background isn't transparent on rotateImagick jpg背景在旋转时不透明
【发布时间】:2015-09-15 21:11:42
【问题描述】:

我目前正在使用 imagemagick 版本 ImageMagick 6.8.4-6 2013-04-04 Q16 使用 Imagick 扩展版本 1620

我正在尝试旋转 jpg 图像并将其合并到另一个 jpg 图像中,但是当我合并图像时,图像周围会出现一个黑框。

请看下面我使用的代码:

public function image($images,$x,$y,$angle){

        if($images != "" && $images != NULL){
         $base = $this->instance;
         $layer = new Imagick($images);

         //resize image

         if($this->id == 45){
             $layer->scaleImage(329,0);
         }
         if($this->id == 44){
            $layer->scaleImage(280,0);
         }
         if($this->id == 42){
            $layer->scaleImage(350,0);
         }

         //rotate image

         $layer->rotateImage(new ImagickPixel("none"), $angle);

         //Merge Image
         if($this->id == 44){
          $base->compositeImage($layer, imagick::COMPOSITE_OVER, $x, $y);
         }else{
          $base->compositeImage($layer, imagick::COMPOSITE_DEFAULT, $x, $y);
         }

         $this->image = $base;
        }


    }

测试当前在 $this->id 使用 44 时运行。 任何人都可以阐明这个问题吗? 提前致谢

【问题讨论】:

  • “Imagick jpg 背景在旋转时不透明” 您需要使用 imagecolortransparent 才能获得透明功能 - 注意 @987654323 @ 没有透明属性,只有 PNGGIF 文件(和 TIFF),但浏览器不支持该格式。您的输出文件需要转换为其中一种格式,最好是PNG,然后设置所需颜色的透明度。 (“我会说,值得作为答案。”);-)
  • “谁能解释一下这个问题?”我做到了---^
  • @Fred-ii- 所以你会建议转换为 PNG 然后旋转吗?然后将 PNG 图像合并到 JPG 中(如果可能的话),因为图像输出需要是 jpg
  • 你必须这样做,你别无选择。
  • @Fred-ii- 感谢您的评论。正如你所说,我没有太多选择。谢谢你。你愿意写这个作为答案吗?

标签: php imagemagick imagick


【解决方案1】:

您需要使用imagecolortransparent 才能获得透明度功能。

注意 JPG 没有透明属性,只有 PNGGIF 文件(和 TIFF),但浏览器不支持该格式。

您的输出文件需要转换为其中一种格式,最好是PNG,然后设置所需颜色的透明度。

“那么您是否建议转换为 PNG 然后旋转?然后将 PNG 图像合并到 JPG 中(如果可能的话),因为图像输出必须是 jpg”

一旦您重新保存为JPG,您将失去透明度

【讨论】:

  • 不幸的是,我不能使用 imagecolortransparent,因为这将是上传的图像,如果该颜色在图像中,它将变得透明
  • @LiamSorsby 好的,我现在看到了您所处的困境。上传的用户可能并不都有PNG 文件,这是您面临的问题吗?
  • 是的,所以基本上上传的图像当前被合并到我们使用 Imagick 的 jpg 背景中。但取决于他们上传的图像类型取决于是否保持透明度。这就是为什么我认为转换为 png,合并然后转换回 jpg 会更好
  • @LiamSorsby 好的,我明白了。如果您还没有根据要上传的文件类型设置if 条件,您可以裁剪JPG,然后使用渐变背景或设置带有边框的新图层,然后是原始@ 987654331@ 最重要的是,然后从那里旋转/合并两者。
  • 唯一的问题是它不会改变它必须旋转的事实。然后留下令人讨厌的像素,这是巴扎尔,因为它使一点点透明,但其余部分则不透明
【解决方案2】:

我是通过 Google 发现的,这是其他人可能会找到的正确答案。您需要使用 setImageMatte(1) 来启用透明度,例如

$src->setImageMatte(1); 
$mask->rotateImage(new ImagickPixel('#00000000'), 10); 

您也可以使用图像遮罩,其中黑色将变为透明使用

$src->compositeImage($mask, Imagick::COMPOSITE_DSTIN, 0, 0, Imagick::CHANNEL_ALPHA);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-03
    • 1970-01-01
    • 1970-01-01
    • 2015-03-25
    • 1970-01-01
    • 1970-01-01
    • 2016-05-11
    • 1970-01-01
    相关资源
    最近更新 更多