PHP Conference Nagoya 2025

Imagick::floodFillPaintImage

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

Imagick::floodFillPaintImageAltera o valor da cor de qualquer pixel que corresponda ao alvo

Descrição

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

Altera o valor da cor de qualquer pixel que corresponda ao alvo e seja um vizinho imediato. Este método é um substituto para a função preterida Imagick::paintFloodFillImage(). Este método estará disponível se a extensão Imagick tiver sido compilada com a ImageMagick versão 6.3.8 ou superior.

Parâmetros

fill

Objeto ImagickPixel ou uma string contendo a cor de preenchimento

fuzz

A quantidade de fuzz. Por exemplo, definir fuzz como 10 e a cor vermelha nas intensidades de 100 e 102, respectivamente, agora são interpretadas como a mesma cor.

target

Objeto ImagickPixel ou uma string contendo a cor alvo a ser pintada

x

Posição X do início do preenchimento

y

Posição Y do início do preenchimento

invert

Se true pinta qualquer pixel que não corresponda à cor alvo.

channel

Fornece qualquer constante de canal que seja válida no modo de canal. Para aplicar a mais de um canal, constantes de canal devem ser combinadas usando operadores bit a bit. O padrão é Imagick::CHANNEL_DEFAULT. Consulte esta lista de constantes de canal

Valor Retornado

Retorna true em caso de sucesso.

Exemplos

Exemplo #1 Exemplo de Imagick::floodfillPaintImage()

<?php

/* Cria novo objeto Imagick */
$im = new Imagick();

/* cria imagens vermelha, verde e azul */
$im->newImage(100, 50, "red");
$im->newImage(100, 50, "green");
$im->newImage(100, 50, "blue");

/* Anexa as imagens em uma só */
$im->resetIterator();
$combined = $im->appendImages(true);

/* Grava a imagem intermediária para comparação */
$combined->writeImage("floodfillpaint_intermediate.png");

/* O pixel alvo para pintura */
$x = 1;
$y = 1;

/* Obtém a cor de pintura */
$target = $combined->getImagePixelColor($x, $y);

/* Pinta o pixel na posição 1,1 de preto e todos os pixels
vizinhos que correspondam à cor alvo */
$combined->floodfillPaintImage("black", 1, $target, $x, $y, false);

/* Grava o resultado */
$combined->writeImage("floodfillpaint_result.png");
?>

O exemplo acima produzirá algo semelhante a:

Saída do exemplo : Imagick::floodfillPaintImage()
Saída do exemplo : Imagick::floodfillPaintImage()

adicione uma nota

Notas Enviadas por Usuários (em inglês) 1 note

up
0
Anonymous
6 years ago
For fuzz, percentage or float values do not seem to work. The value is based on the intensity of the image colors.

The documentation states: "The amount of fuzz. For example, set fuzz to 10 and the color red at intensities of 100 and 102 respectively are now interpreted as the same color."

For those of us who are not graphics geeks, your color intensity might be something like 65535. In which case, to get just 10% fuzz, you need to set it to 6550.

You likely will not see any effect if you are using low numbers or floats, like 100, 20, or 0.8.

For example:
$im = new Imagick();
$transparentColor = new ImagickPixel('transparent');
$greenscreen = '#00FF08'; // Super bright green

$im->readImage("cartoon_dog.png"); // Cartoony dog with a black outline and a #00FF08 (super bright green) background.

// Replace the green background with transparent.

// Leaves significant green lines around the outline of the dog, which is unacceptable.
$im->floodFillPaintImage($transparentColor, 30, $greenscreen, 0, 0, false, Imagick::CHANNEL_ALPHA);

// Works as intended - removes all of the green background.
$im->floodFillPaintImage($transparentColor, 30000, $greenscreen, 0, 0, false, Imagick::CHANNEL_ALPHA);

Credit to the discussion here:
https://php5.kiev.ua/php7/imagick.painttransparentimage.html
To Top