2024年PHP开发者大会(日本)

Imagick::floodFillPaintImage

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

Imagick::floodFillPaintImage更改与目标匹配的任何像素的颜色值

描述

public Imagick::floodFillPaintImage(
    混合 $fill,
    浮点数 $fuzz,
    混合 $target,
    整数 $x,
    整数 $y,
    布尔值 $invert,
    整数 $channel = Imagick::CHANNEL_DEFAULT
): 布尔值

更改与目标匹配且为直接相邻像素的颜色值。此方法替换了已弃用的 Imagick::paintFloodFillImage()。如果Imagick已针对ImageMagick 6.3.8或更高版本编译,则此方法可用。

参数

fill

ImagickPixel 对象或包含填充颜色的字符串

fuzz

模糊量。例如,将fuzz设置为10,则强度分别为100和102的红色现在被解释为相同的颜色。

target

ImagickPixel 对象或包含要绘制的目标颜色的字符串

x

泛洪填充的X起始位置

y

泛洪填充的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