PHP Conference Japan 2024

Imagick::paintTransparentImage

(PECL imagick 2, PECL imagick 3)

Imagick::paintTransparentImage將任何與填滿顏色匹配的像素變更為填滿所定義的顏色

警告

自 Imagick 3.4.4 起,此函數已過時。 強烈建議不要依賴此函數。

說明

public Imagick::paintTransparentImage(mixed $target, float $alpha, float $fuzz): bool

將任何與填滿顏色匹配的像素變更為填滿所定義的顏色。

參數

target

將此目標顏色變更為影像內指定的透明度值。

alpha

透明度等級:1.0 為完全不透明,而 0.0 為完全透明。

fuzz

影像的 fuzz 成員定義了多少容差是可以接受的,才能將兩種顏色視為相同。

傳回值

成功時傳回 true

錯誤/例外

發生錯誤時擲回 ImagickException。

變更日誌

版本 說明
PECL imagick 2.1.0 現在允許使用字串表示顏色作為第一個參數。 之前的版本僅允許使用 ImagickPixel 物件。

新增註解

使用者貢獻的註解 3 則註解

2
匿名
15 年前
實際上,它似乎確實有效,只是可能不是預期的方式。

查看 ImageMagick 網站上的 fuzz 選項 (https://imagemagick.dev.org.tw/script/command-line-options.php#fuzz),「距離可以採用絕對強度單位,或者,透過附加 % 作為最大可能強度 (255、65535 或 4294967295) 的百分比。」

由於它需要 float,因此百分比值將不起作用,因此它實際上是最大強度值之一。 在我的情況下,我正在使用的影像似乎具有 65535 的最大強度值。 因此,大約 10% 的 fuzz 為 6500,似乎就可行了。

但可能會有問題的部分是,您要如何決定顏色/影像的最大強度? 使用靜態的 6500 會很好,直到我必須轉換最大強度不是 65535 的影像為止。 如果是 255,則會清除整個影像。 或者 fuzz 在較大的值上會大幅縮減。
0
quickshiftin at gmail dot com
10 年前
請查看 Stackoverflow 上的這個討論串,以了解如何判斷影像最大強度的答案。

http://stackoverflow.com/questions/26239130/determine-max-possible-intensity-of-image/26240656#26240656

簡而言之,以下程式碼可讓 $fuzz 參數的行為更符合您的預期 (現在表示 0-100 之間的百分比)。 $fuzz 值現在應該是 0 到 1 之間的 float。

class SaneImagick extends Imagick
{
public function paintTransparentImage($target, $alpha, $fuzz)
{
$iQuantumDepth = pow(2, $this->getQuantumDepth()['quantumDepthLong']);
return parent::paintTransparentImage($target, $alpha, $fuzz * $iQuantumDepth);
}
}
0
alain at ocarina dot fr
13 年前
fuzz 在 0 到 65535 的範圍內運作良好。

我建議您嘗試在顏色光譜影像上移動 fuzz。

1/ 取得顏色光譜 (Google 圖片有很多)

2/ 嘗試此程式碼

<?php

function fuzzTest($source, $target, $fuzz) {

// 載入影像
$im = new Imagick($source);

// 調整影像大小,使其易於比較
$im->resizeImage(320, 240, Imagick::FILTER_LANCZOS, 1, true);

// 套用 fuzz
$im->paintTransparentImage($im->getImagePixelColor(0, 0), 0, $fuzz);

// 寫入影像
$im->setImageFormat('png');
$im->writeImage($target);
$im->destroy();

return
true;
}

for (
$i = 0; ($i <= 10); $i++) {
fuzzTest('spectrum.png', "test_{$i}.png", (6553.5 * $i));
echo
'<img src="test_' . $i . '.png" />&nbsp;';
}

?>
To Top