Маска PNG с черно-белой маской - PullRequest
0 голосов
/ 27 января 2020

У меня есть следующее изображение (обратите внимание на прозрачный фон):

enter image description here

У меня также есть черно-белая маска из тот же размер :

enter image description here

Я хотел бы «обрезать» платье и получить только часть первого изображения, содержащегося в черном круге , Я пробовал много разных методов, но они не работали или слишком медленные:

1) ImageMagick (командная строка) <== какую команду я могу использовать для достижения этой цели? Я пробовал умножение и копирование, но они не работали </p>

2) WideImage работает: $maskedImage = $source->applyMask($mask);, но это занимает более 12 секунд.

Меня интересует решение ImageMagick, если это возможно.

РЕДАКТИРОВАТЬ

Представленные решения работают нормально, если маска меньше исходного изображения и если простое исходное изображение. С этим исходным изображением и маской результат «смазан»:

Источник:

enter image description here

Маска:

enter image description here

Команда:

convert source.png \( mask.png -negate \) -alpha off -compose copy_opacity -composite result.png

Результат (я добавил серый фон вместо прозрачного, чтобы показать неправильный белый):

enter image description here

Ответы [ 4 ]

0 голосов
/ 04 марта 2020

В конце дня я продолжал использовать WideImage, который довольно медленный, но работает хорошо. Это класс, который я использую для маскировки изображений:

<?php

namespace AppBundle\Service\Import;

use WideImage\WideImage;

class ImageMasker
{
    /**
     * @var string
     */
    private $tempDirectory;

    public function __construct(string $tempDirectory)
    {
        $this->tempDirectory = $tempDirectory;
    }

    /**
     * @param string $sourcePath
     * @param string $maskPath
     */
    public function mask($sourcePath, $maskPath)
    {
        $source = WideImage::load($sourcePath);
        $mask   = WideImage::load($maskPath);

        $tempFilename = uniqid().'.png';
        $tempPath     = rtrim($this->tempDirectory, DIRECTORY_SEPARATOR).DIRECTORY_SEPARATOR.$tempFilename;

        // applies the mask and saves the file
        $maskedImage = $source->applyMask($mask);
        $maskedImage->saveToFile($tempPath);

        return $tempPath;
    }
}
0 голосов
/ 27 января 2020

Ваша версия ImageMagick выглядит слишком старой, чтобы включать оператор сочинения "copyalpha". Вот еще один способ получить ваш результат ...

convert dress.png \( circle.png -negate \) \
   \( -clone 0 -transparent red +transparent red \) -insert 0 -composite result.png

, который читает ваше основное изображение, затем читает изображение маски и сводит его на нет, затем создает прозрачный слой и перемещает его на первую позицию в список с "-insert". Обработка по умолчанию «-composite» с тремя входными изображениями в ImageMagick заключается в использовании третьего изображения, теперь с черным кружком, в качестве альфа-маски. Вам все еще нужно «-negate» этой маски или создать новую маску с инвертированным черно-белым.

Метод, используемый там для создания прозрачного холста, заключается в чтении одного из других изображений в скобках, измените все с красного на прозрачное, затем измените все не с красного на прозрачное. В результате получается полностью прозрачный холст для использования в качестве первого изображения, целевого изображения в составном списке.

0 голосов
/ 27 января 2020

Он должен нормально работать в ImageMagick 6 или ImageMagick 7, используя copy_opacity, а не copy_alpha. Это прекрасно работает для меня:

Ввод:

enter image description here

Маска:

enter image description here

convert dress.png \( mask.png -negate \) -alpha off -compose copy_opacity -composite result.png


enter image description here

Приведенная выше команда с использованием convert предназначена для ImageMagick 6. При использовании ImageMagick 7 измените преобразование на магическое. Оба работают на меня.

0 голосов
/ 27 января 2020

Я думаю, вы хотите это:

magick dress.png \( mask.png -alpha off -negate \) -compose copyalpha -composite result.png

enter image description here

Или, если вам не нравятся скобки, загрузите маску и сначала разберитесь в вашем альфа-канале , затем загрузите платье, затем +swap порядок перед составлением:

magick mask.png -alpha off -negate dress.png +swap  -compose copyalpha -composite result.png
...