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 個註解

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
10 年前
此函式已棄用,並且會在 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
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');

?>
0
Samuel Fine (hi at samuelfine dot com)
13 年前
這對於準確地將 .ico 檔案轉換為 .png 也很有用。(理論上其他型別也適用,但我只測試過 ico->png。)只需使用 setFormat 就會建立有效的 .png 檔案,但如果原始 .ico 具有任何透明度,則會導致影像失真。以下程式碼會建立準確的副本

<?php

$im
= new Imagick();

// 處理 .ico 檔案時,請務必在載入影像之前設定格式,否則會發生嚴重的例外。有關更多詳細資訊,請參閱 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