gregghz
gregghz

Reputation: 3965

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?

Upvotes: 14

Views: 8337

Answers (3)

quickshiftin
quickshiftin

Reputation: 69581

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.

Upvotes: 2

stwhite
stwhite

Reputation: 3275

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

Upvotes: 7

Andrew Odri
Andrew Odri

Reputation: 9432

I haven't tested this, but if your end goal is the generate an opaque image with no alpha channel support, perhaps try setting the Imagick::setFormat function to png24.

$tmpa->setFormat('png24');

This will force the Imagick object to use the opaque 24bit PNG format, rather than the opaque or transparent 32bit PNG format. You may have to set a background color or something to that effect to ensure that any alpha objects added to the image are dealt with appropriately.

Upvotes: -1

Related Questions