PHP Conference Japan 2024

Imagick::floodFillPaintImage

(PECL imagick 2 >= 2.3.0, PECL imagick 3)

Imagick::floodFillPaintImage變更任何符合目標的像素的顏色值

描述

public Imagick::floodFillPaintImage(
    mixed $fill,
    float $fuzz,
    mixed $target,
    int $x,
    int $y,
    bool $invert,
    int $channel = Imagick::CHANNEL_DEFAULT
): bool

變更任何符合目標且是直接鄰居的像素的顏色值。此方法是取代已棄用的 Imagick::paintFloodFillImage()。如果 Imagick 是針對 ImageMagick 6.3.8 或更新版本編譯,則此方法可用。

參數

fill

ImagickPixel 物件或包含填滿顏色的字串

fuzz

模糊量。例如,將 fuzz 設定為 10,強度分別為 100 和 102 的紅色現在會被解釋為相同的顏色。

target

ImagickPixel 物件或包含要繪製的目標顏色的字串

x

Floodfill 的 X 起始位置

y

Floodfill 的 Y 起始位置

invert

如果為 true,則會繪製任何不符合目標顏色的像素。

channel

提供任何對您的通道模式有效的通道常數。若要套用至多個通道,請使用位元運算符組合 通道常數。預設為 Imagick::CHANNEL_DEFAULT。請參閱此 通道常數清單

回傳值

成功時回傳 true

範例

範例 1 Imagick::floodfillPaintImage() 範例

<?php

/* 建立新的 Imagick 物件 */
$im = new Imagick();

/* 建立紅色、綠色和藍色影像 */
$im->newImage(100, 50, "red");
$im->newImage(100, 50, "green");
$im->newImage(100, 50, "blue");

/* 將影像附加到一個 */
$im->resetIterator();
$combined = $im->appendImages(true);

/* 儲存用於比較的中間影像 */
$combined->writeImage("floodfillpaint_intermediate.png");

/* 要繪製的目標像素 */
$x = 1;
$y = 1;

/* 取得我們要繪製的顏色 */
$target = $combined->getImagePixelColor($x, $y);

/* 將位置 1,1 中的像素繪製為黑色,並繪製所有符合目標顏色的相鄰像素 */
$combined->floodfillPaintImage("black", 1, $target, $x, $y, false);

/* 儲存結果 */
$combined->writeImage("floodfillpaint_result.png");
?>

以上範例會輸出類似以下的結果

Output of example : Imagick::floodfillPaintImage()
Output of example : Imagick::floodfillPaintImage()

新增筆記

使用者提供的筆記 1 筆筆記

0
匿名
6 年前
對於 fuzz,百分比或浮點數值似乎不起作用。該值基於影像顏色的強度。

文件指出:「模糊量。例如,將 fuzz 設定為 10,強度分別為 100 和 102 的紅色現在會被解釋為相同的顏色。」

對於我們這些不是圖形極客的人來說,您的顏色強度可能類似於 65535。在這種情況下,若要獲得僅 10% 的模糊,您需要將其設定為 6550。

如果您使用較低的數字或浮點數(如 100、20 或 0.8),您可能看不到任何效果。

例如
$im = new Imagick();
$transparentColor = new ImagickPixel('transparent');
$greenscreen = '#00FF08'; // 超亮綠色

$im->readImage("cartoon_dog.png"); // 卡通狗,帶有黑色輪廓和 #00FF08 (超亮綠色) 背景。

// 將綠色背景替換為透明。

// 在狗的輪廓周圍留下明顯的綠色線條,這是無法接受的。
$im->floodFillPaintImage($transparentColor, 30, $greenscreen, 0, 0, false, Imagick::CHANNEL_ALPHA);

// 按預期工作 - 移除所有綠色背景。
$im->floodFillPaintImage($transparentColor, 30000, $greenscreen, 0, 0, false, Imagick::CHANNEL_ALPHA);

感謝此處的討論
https://php5.kiev.ua/php7/imagick.painttransparentimage.html
To Top