©
本文档使用
php.cn手册 发布
(PECL imagick 2.0.0)
Imagick::flattenImages — Merges a sequence of images
Merges a sequence of images. This is useful for combining Photoshop layers into a single image.
成功时返回 TRUE
。
错误时抛出 ImagickException。
[#1] A.Ross [2015-03-26 13:44:51]
Replying to Francois:
<?php
$im->setImageBackgroundColor('white');
$im->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE);
$im->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
?>
Imagick::ALPHACHANNEL_REMOVE has been added in 3.2.0b2 (before the RC): http://pecl.php.net/package-info.php?package=imagick&version=3.2.0b2
The problem is with people who want to implement this, but are stuck with an Imagick version < 3.2.0b2. They can't use this constant. However, all is not lost. I've found a reference where someone got this to work using an integer: http://stackoverflow.com/q/28154179/1000608
The number he used is 11, which seems to suggest that the value of Imagick::ALPHACHANNEL_REMOVE is 11, and the function worked correctly in this usecase even before the constant was implemented. So if you're stuck with <3.2.0b2 this is the code you need:
<?php
$im->setImageBackgroundColor('white');
$im->setImageAlphaChannel(11);
$im->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
?>
This works at least as far back as version 3.1.0~rc1-1 (current version of the php5-imagick package in Debian 7).
[#2] thomasbachem [2015-03-10 00:05:25]
The actual replacement now that flattenImages() has been deprecated is:
<?php
$im = $im->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
?>
So you need to (re)assign the returned Imagick object.
[#3] francois [2015-02-06 19:57:01]
As nick said, the function Imagick::flattenImages() is deprecated. Replacing it by Imagick::mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN) partially worked. Images with transparency (ex: .png) get black background even if the image background is set to white.
Old working code:
$im->setImageBackgroundColor('white');
$im = $im->flattenImages();
New working code:
$im->setImageBackgroundColor('white');
$im->setImageAlphaChannel(imagick::ALPHACHANNEL_REMOVE);
$im->mergeImageLayers(imagick::LAYERMETHOD_FLATTEN);
imagick::ALPHACHANNEL_REMOVE is not shown on the constants page but do works with Imagick 3.2.0RC1.
[#4] nick at nickdobie dot com [2014-11-11 14:38:23]
This function is deprecated and will throw a warning in PHP 5.6. Simply replace this call with Imagick::mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN) and it will behave the same way.
[#5] ureimers [2014-02-10 11:15:11]
Small correction to Jairu5's code:
If you want to set the background color of a transparent image you have to set it _before_ loading the image.
Flattening images by default uses the background color 'white'. That's why Jairu5's code seem to work at first, but only until you want to actually change the background color to something different than white.
Try using this instead:
<?php
$im = new Imagick();
$im->setImageBackgroundColor('green');
$im->readimage('image.png');
$im = $im->flattenImages();
$im->setImageFormat('jpg');
$im->writeImage('image.jpg');
?>
[#6] Samuel Fine (hi at samuelfine dot com) [2011-12-05 09:32:57]
This is also useful for accurately converting .ico files to .png. (Other types as well, in theory, but I've only tested ico->png.) Simply using setFormat will create a valid .png file, but will result in image artifacts if the original .ico had any transparency. The following code will create an accurate copy:
<?php
$im = new Imagick();
// When dealing with .ico files, make sure to setFormat before loading the image or you'll get a nasty exception. See https://bugs.php.net/bug.php?id=58515 for more details.
$im->setFormat("ico");
$im->readImage("favicon.ico");
$im = $im->flattenImages(); // Thanks for the tip, Jairu5!
$im->setFormat("png");
$new = fopen("favicon.png", "w");
$im->writeImageFile($new);
$im->clear();
$im->destroy();
?>
[#7] Jairu5 [2010-11-30 08:29:34]
Note that the function returns an Imagick object and does not modify the existing object. Below is my code for converting a PNG with transparency into a JPG with a background color. This code illustrates the difference.
<?php
$im = new Imagick('image.png');
$im->setImageBackgroundColor('white');
$im->flattenImages(); // This does not do anything.
$im = $im->flattenImages(); // Use this instead.
$im->setImageFormat('jpg');
$im->writeImage('image.jpg');
?>