Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

ImageMagick -- setImageAlphaChannel not working (php)

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?

like image 702
gregghz Avatar asked May 29 '12 19:05

gregghz


2 Answers

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

like image 124
stwhite Avatar answered Nov 17 '22 23:11

stwhite


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

Install imagemagick from source

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

Install pecl

sudo apt-get install php5-dev php-pear

Install php imagick from source

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

Verify php imagick is installed and setImageAlphaChannel is available

php --rc Imagick | grep -i setImageAlphaChannel

If grep finds a match, the installation was successful.

like image 44
quickshiftin Avatar answered Nov 18 '22 00:11

quickshiftin