So I have this IM command ($plistnew is a list of coords as you'd expect for polygon):
convert in.png ( -size 101x101 xc:black -fill white \
-draw "polygon $plistnew" -alpha off \
-crop 101x100+0+1 +repage \
-scale 101x1! ) \
-clut out.png
So I need to convert this to pure PHP. I have been pretty much successful except for one remaining issue with setImageAlphaChannel().
Anyway, this is my 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();
The $points variable is an array formed properly for use with ImagickDraw::polygon().
This line:
$tmpa->setImageAlphaChannel(self::ALPHACHANNEL_DEACTIVATE);
flat out doesn't work. It produces this error:
PHP Fatal error: Uncaught exception 'ImagickException' with message 'Unable to set image alpha channel'
When I comment that line out everything seems to be working fine otherwise. How can I prevent this error?
I also was having issues with removing the alpha channel of PNG's and GIF's, so I tried a couple things, but ended up using this:
// 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);
}
I went with using "11" because imagick::ALPHACHANNEL_REMOVE wouldn't work with my version. For reference on imagick::ALPHACHANNEL_REMOVE, see this comment: http://php.net/manual/en/imagick.flattenimages.php#116665
Per the manual for setImageAlphaChannel
This method is available if Imagick has been compiled against ImageMagick version 6.3.8 or newer.
You'll likely need to build the Imagick extension against an appropriate version of imagemagick on your own. Surely you can google for the steps, but here is a rough example of what I've done on Ubuntu, YMMV
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
sudo apt-get install php5-dev php-pear
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
setImageAlphaChannel
is availablephp --rc Imagick | grep -i setImageAlphaChannel
If grep finds a match, the installation was successful.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With