Imagick::flattenImages

(PECL imagick 2, PECL imagick 3)

Imagick::flattenImages合并一系列图像

警告

此函数已在 Imagick 3.4.4 中 弃用。强烈建议不要依赖此函数。

描述

public Imagick::flattenImages(): Imagick

合并一系列图像。这对于将 Photoshop 图层组合到单个图像中很有用。

参数

此函数没有参数。

返回值

成功时返回 true

错误/异常

发生错误时抛出 ImagickException。

添加备注

用户贡献的备注 7 个备注

22
A.Ross
9 年前
回复 Francois
<?php
$im
->setImageBackgroundColor('white');
$im->setImageAlphaChannel(Imagick::ALPHACHANNEL_REMOVE);
$im->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
?>

Imagick::ALPHACHANNEL_REMOVE 已在 3.2.0b2(RC 之前)中添加:http://pecl.php.net/package-info.php?package=imagick&version=3.2.0b2

问题在于想要实现此功能但受限于 Imagick 版本 < 3.2.0b2 的人。他们无法使用此常量。但是,并非一切都丢失了。我找到了一个参考,有人使用整数使其工作:http://stackoverflow.com/q/28154179/1000608

他使用的数字是 11,这似乎表明 Imagick::ALPHACHANNEL_REMOVE 的值为 11,并且该函数在此用例中甚至在实现常量之前也能够正常工作。因此,如果您受限于 <3.2.0b2,则需要以下代码

<?php
$im
->setImageBackgroundColor('white');
$im->setImageAlphaChannel(11);
$im->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
?>

这至少在 3.1.0~rc1-1 版本(Debian 7 中 php5-imagick 软件包的当前版本)中有效。
12
thomasbachem
9 年前
现在 flattenImages() 已弃用,实际的替换是

<?php
$im
= $im->mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN);
?>

因此,您需要(重新)分配返回的 Imagick 对象。
3
nick at nickdobie dot com
9 年前
此函数已弃用,将在 PHP 5.6 中引发警告。只需将此调用替换为 Imagick::mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN),它将以相同的方式运行。
5
francois
9 年前
正如 nick 所说,函数 Imagick::flattenImages() 已弃用。用 Imagick::mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN) 替换它部分有效。具有透明度的图像(例如:.png)即使图像背景设置为白色也会获得黑色背景。

旧的工作代码
$im->setImageBackgroundColor('white');
$im = $im->flattenImages();

新的工作代码
$im->setImageBackgroundColor('white');
$im->setImageAlphaChannel(imagick::ALPHACHANNEL_REMOVE);
$im->mergeImageLayers(imagick::LAYERMETHOD_FLATTEN);

imagick::ALPHACHANNEL_REMOVE 未在常量页面上显示,但与 Imagick 3.2.0RC1 一起使用时有效。
1
Jairu5
13 年前
请注意,该函数返回一个 Imagick 对象,不会修改现有对象。以下是将具有透明度的 PNG 转换为具有背景颜色的 JPG 的代码。此代码说明了差异。

<?php

$im
= new Imagick('image.png');
$im->setImageBackgroundColor('white');

$im->flattenImages(); // 这不起作用。
$im = $im->flattenImages(); // 使用此代码代替。

$im->setImageFormat('jpg');
$im->writeImage('image.jpg');

?>
0
Samuel Fine (hi at samuelfine dot com)
12 年前
这也适用于将 .ico 文件准确地转换为 .png。(理论上也适用于其他类型,但我只测试了 ico->png)。简单地使用 setFormat 将创建一个有效的 .png 文件,但如果原始 .ico 具有任何透明度,则会导致图像伪像。以下代码将创建一个准确的副本

<?php

$im
= new Imagick();

// 处理 .ico 文件时,请确保在加载图像之前设置 Format,否则会收到难看的异常。有关更多详细信息,请参阅 https://bugs.php.net/bug.php?id=58515
$im->setFormat("ico");

$im->readImage("favicon.ico");

$im = $im->flattenImages(); // 感谢 Jairu5 的提示!

$im->setFormat("png");

$new = fopen("favicon.png", "w");
$im->writeImageFile($new);
$im->clear();
$im->destroy();

?>
-3
ureimers
10 年前
对 Jairu5 代码的小修正

如果您想设置透明图像的背景颜色,您必须在加载图像 _之前_ 设置它。
默认情况下,平铺图像使用背景颜色“白色”。这就是为什么 Jairu5 的代码乍一看似乎有效,但仅在您想要将背景颜色实际更改为除白色之外的其他颜色时有效。

尝试使用此代码代替

<?php

$im
= new Imagick();
$im->setImageBackgroundColor('green');
$im->readimage('image.png');

$im = $im->flattenImages();

$im->setImageFormat('jpg');
$im->writeImage('image.jpg');

?>
To Top