Я ищу способ преобразования изображения, чтобы все непрозрачные пиксели (те, которые имеют альфа! = 1), в черные и прозрачные пиксели, не затронуты (или преобразованы в белый). Самое близкое, что я получил, было с приведенной ниже командой imagemagick:
convert <img> -colorspace Gray <out>
Однако это все еще дает мне серые цвета вместо полного черного. Я пробовал все параметры цветового пространства, и никто не выполняет эту работу.
Любая идея, как я мог бы достичь этого с помощью imagemagick или со схожими инструментами (или с библиотекой PHP, если он существует)
Я знаю, что этот вопрос старый, но теперь я наткнулся на него, я мог бы ответить на него.
Команда ImageMagick, которую вы хотите, это:
convert <img> -alpha extract -threshold 0 -negate -transparent white <out>
Я буду разбивать, что это делает.
-alpha extract
– Возьмите альфа-маску изображения. Полностью прозрачные пиксели будут черными, полностью непрозрачными – белыми. -threshold 0
– Увеличить все каналы до их максимального значения, если они больше нуля. В этом случае он будет делать каждый пиксель белого цвета, кроме тех, которые полностью черные . -negate
– Инвертировать изображение . Теперь наши черные белые, а белые – черные. -transparent white
Установите белые пиксели в прозрачные . Это можно исключить, если вы предпочтете, чтобы ваши первоначальные прозрачные пиксели были белыми. Я не уверен, поможет ли это вам (т. Е. Будут ли представленные методы оставлены только прозрачными пикселями), но проверьте ответы на этот вопрос: PHP / ImageMagic Получите «тень» изображения
Ну, вы можете сделать это с помощью GD и пары петель:
$img = imagecreatefromstring(file_get_contents($imgFile)); $width = imagesx($img); $hieght = imagesy($img); $black = imagecolorallocate($img, 0, 0, 0); $white = imagecolorallocate($img, 255, 255, 255); for ($x = 0; $x < $width; $x++) { for ($y = 0; $y < $width; $y++) { $color = imagecolorat($img, $x, $y); $color = imagecolorforindex($color); if ($color['alpha'] == 1) { imagesetpixel($img, $x, $y, $black); } else { imagesetpixel($img, $x, $y, $white); } } }
Или вы можете заменить цвета (это может работать или не работать):
$img = imagecreatefromstring(file_get_contents($imgFile)); $maxcolors = imagecolorstotal($img); for ($i = 1; $i <= $maxcolors; $i++) { $color = imagecolorforindex($i); if ($color['alpha'] == 1) { imagecolorset($img, $i, 0, 0, 0); } else { imagecolorset($img, $i, 255, 255, 255); } }