【问题标题】:ImageMagick -- setImageAlphaChannel not working (php)ImageMagick -- setImageAlphaChannel 不工作 (php)
【发布时间】:2012-06-04 00:42:10
【问题描述】:

所以我有这个 IM 命令($plistnew 是您对多边形所期望的坐标列表):

convert in.png ( -size 101x101 xc:black -fill white \
    -draw "polygon $plistnew" -alpha off \
    -crop 101x100+0+1 +repage \
    -scale 101x1! ) \
    -clut out.png

所以我需要将其转换为纯 PHP。除了 setImageAlphaChannel() 的一个剩余问题之外,我已经非常成功了。

无论如何,这是我的 PHP:

$tmpa = new Imagick(); // for the image I'm assuming is generated inside the parens
$tmpa->newPseudoImage(101, 101, 'canvas:black'); // xc:black

$draw = new ImagickDraw();
$draw->setFillColor(new ImagickPixel('white')); // -fill white
$draw->polygon($points); // -draw "polygon $plistnew"

$tmpa->drawImage($draw);
$tmpa->setImageAlphaChannel(self::ALPHACHANNEL_DEACTIVATE); // -alpha off
$tmpa->cropImage(101, 100, 0, 1); // -crop 101x100+0+1

// +repage
$tmpa->resetImagePage('');

$tmpa->scaleImage(101, 1); // -scale 101x1! -- I think scaleImage() ignores ratio per the ! by default ... I'm not positive though.

$im = new Imagick('in.png');
$im->clutImage($tmpa); // -clut
$im->writeImage('out.png');
$tmpa->destroy();

$points 变量是一个正确形成的数组,可与 ImagickDraw::polygon() 一起使用。

这一行:

$tmpa->setImageAlphaChannel(self::ALPHACHANNEL_DEACTIVATE);

完全不工作。它会产生这个错误:

PHP Fatal error:  Uncaught exception 'ImagickException' with message 'Unable to set image alpha channel'

当我评论这条线时,一切似乎都正常工作。如何防止此错误?

【问题讨论】:

  • 您可以在此处找到所有选项:imagemagick.org/script/… 101x1!表示图像大小为 101x1,纵横比被忽略。 +repage "reset the virtual canvas" 也就是你看不到的图像画布从 101x101 调整为 101x1。如果您在之前和之后在另一个程序中检查了图像,您会在新图像周围看到一个棋盘格图像;这已被删除。
  • 谢谢,我已根据您提供的信息更新以反映新的代码/cmets。
  • 你的多边形值是多少,我会试试你的代码,因为它可能是版本问题。
  • 啊,我对 $tmpA 的看法......这只是一个正在处理的临时图像,在这种情况下这只是输入图像。这是一个更大的脚本的一部分,它也进行一些其他处理。我会很快编辑的。此外,多边形值:4,0 27,33 46,53 62,73 100,86
  • 我得走了;我对您有不同的问题,并认为这是版本问题。我无法使用 newPseudoImage 并且还卡在 setImageAlphaChannel 上。当注释掉我的 $this-> 你有没有考虑过使用 exec() 的另一个错误?

标签: php image-processing imagemagick imagick


【解决方案1】:

我在删除 PNG 和 GIF 的 alpha 通道时也遇到了问题,所以我尝试了一些方法,但最终还是使用了这个:

// Image has transparency
if ($image->getImageAlphaChannel()) {

    // Remove alpha channel
    $image->setImageAlphaChannel(11);

    // Set image background color
    $image->setImageBackgroundColor('white');

    // Merge layers
    $image->mergeImageLayers(imagick::LAYERMETHOD_FLATTEN);
}

我选择使用“11”,因为 imagick::ALPHACHANNEL_REMOVE 不适用于我的版本。有关 imagick::ALPHACHANNEL_REMOVE 的参考,请参阅此评论:http://php.net/manual/en/imagick.flattenimages.php#116665

【讨论】:

  • 这是我找到的唯一可行的解​​决方案,感谢您救了我
【解决方案2】:

the manualsetImageAlphaChannel

如果已经编译了 Imagick,则此方法可用 ImageMagick 6.3.8 或更高版本。

您可能需要自己针对适当版本的 imagemagick 构建 Imagick 扩展。当然你可以用谷歌搜索这些步骤,但这是我在 Ubuntu YMMV 上所做的一个粗略示例

从源代码安装 imagemagick

apt-get install build-essential libpng12-dev libglib2.0-dev libfontconfig1-dev zlib1g-dev libtiff4-dev libexif-dev libfreetype6-dev

mkdir sources
cd sources
wget http://www.imagemagick.org/download/ImageMagick.tar.gz
tar -xzf ImageMagick.tar.gz

new_dir=$(ls -1 | grep ImageMagick-)
cd $new_dir
./configure --prefix=/usr --without-lzma --without-jng --without-jbig --without-mpeg --without-ps
make
make install

安装 pecl

sudo apt-get install php5-dev php-pear

从源代码安装 php imagick

sudo pecl config-set preferred_state beta
sudo apt-get remove --purge php5-imagick
sudo pecl install imagick
sudo bash -c 'echo extension=/usr/lib/php5/20121212/imagick.so > /etc/php5/mods-available/imagick.ini'
sudo php5enmod imagick

验证 php imagick 已安装且setImageAlphaChannel 可用

php --rc Imagick | grep -i setImageAlphaChannel

如果 grep 找到匹配项,则安装成功。

【讨论】:

    【解决方案3】:

    我尚未对此进行测试,但如果您的最终目标是生成不支持 Alpha 通道的不透明图像,不妨尝试将 Imagick::setFormat 函数设置为 png24

    $tmpa->setFormat('png24');
    

    这将强制 Imagick 对象使用不透明的 24 位 PNG 格式,而不是不透明或透明的 32 位 PNG 格式。您可能需要设置背景颜色或其他效果,以确保正确处理添加到图像中的任何 alpha 对象。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-18
      • 2011-02-27
      • 1970-01-01
      • 2014-06-10
      • 1970-01-01
      • 1970-01-01
      • 2020-01-06
      相关资源
      最近更新 更多