Преобразование непрозрачных пикселей в черный - PullRequest
5 голосов
/ 06 августа 2010

Я ищу способ преобразования изображения таким образом, чтобы все непрозрачные пиксели (те, которые имеют альфа! = 1) в черные и прозрачные пиксели не были затронуты (или преобразованы в белый). Самое близкое, что я получил, было с приведенной ниже командой imagemagick:

convert <img> -colorspace Gray <out>

Однако это все равно дает мне немного серого цвета вместо полного черного. Я перепробовал все варианты цветового пространства, и ни один не справился с работой.

Любая идея, как я могу добиться этого с помощью imagemagick или с помощью аналогичных инструментов (или с помощью библиотеки PHP, если она существует)

Ответы [ 3 ]

22 голосов
/ 22 сентября 2011

Я знаю, что этот вопрос старый, но теперь я наткнулся на него, и я мог бы также ответить на него.

Требуемая команда ImageMagick:

convert <img> -alpha extract -threshold 0 -negate -transparent white <out>

Я также расскажу, что он делает.

  1. -alpha extract - Возьмите альфа-маску изображения. Полностью прозрачные пиксели будут черными, а полностью непрозрачными - белыми.
  2. -threshold 0 - Увеличить все каналы до максимального значения, если они больше нуля. В этом случае сделает каждый пиксель белым, кроме тех, которые полностью черные .
  3. -negate - Инвертировать изображение . Теперь наши черные - белые, а белые - черные.
  4. -transparent white - Установить прозрачность белых пикселей . Это можно исключить, если вы предпочитаете, чтобы изначально прозрачные пиксели были белыми.

До

PNG image with alpha channel

* После 1035 * Previous image after running the convert command

1 голос
/ 06 августа 2010

Ну, вы можете сделать это с 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);
    }
}
1 голос
/ 06 августа 2010

Я не уверен, поможет ли это вам (то есть, оставят ли представленные методы прозрачные пиксели в покое), но посмотрите ответы на этот вопрос: PHP / ImageMagic Получите «тень» изображения

...