PHP Conference Japan 2024

Imagick::flattenImages

(PECL imagick 2, PECL imagick 3)

Imagick::flattenImages合并图像序列

警告

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

描述

public Imagick::flattenImages(): Imagick

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

参数

此函数没有参数。

返回值

成功时返回true

错误/异常

发生错误时抛出 ImagickException。

添加注释

用户贡献的注释 7 条注释

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 包的当前版本)中有效。
thomasbachem
9 年前
现在 flattenImages() 已弃用,实际的替换是

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

因此,您需要(重新)分配返回的 Imagick 对象。
nick at nickdobie dot com
10 年前
此函数已弃用,将在 PHP 5.6 中引发警告。只需将此调用替换为 Imagick::mergeImageLayers(Imagick::LAYERMETHOD_FLATTEN),它将具有相同的行为。
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。
Jairu5
14 年前
请注意,该函数返回一个 Imagick 对象,并且不会修改现有对象。以下是将具有透明度的 PNG 转换为具有背景颜色的 JPG 的代码。此代码说明了差异。

<?php

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

$im->flattenImages(); // 这不会做任何事情。
$im = $im->flattenImages(); // 使用此方法代替。

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

?>
Samuel Fine (hi at samuelfine dot com)
13 年前
这对于将 .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();

?>
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