13

所以我有这个 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'

当我评论这条线时,一切似乎都正常工作。我怎样才能防止这个错误?

4

3 回答 3

6

我在删除 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

于 2015-06-20T19:42:08.890 回答
2

根据手册_setImageAlphaChannel

如果 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 找到匹配项,则安装成功。

于 2016-01-02T17:53:07.073 回答
-1

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

$tmpa->setFormat('png24');

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

于 2012-06-19T19:12:40.947 回答