Imagick. Изменение цвета на прозрачный - PullRequest
4 голосов
/ 15 февраля 2012

Я хотел бы изменить черную границу этого изображения: http://dev.loungeup.net/im/ на прозрачную с помощью Imagick в PHP.

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

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

Любая помощь приветствуется.

Спасибо

1 Ответ

13 голосов
/ 23 февраля 2012

Вот один метод, который вы можете использовать, который похож на инструмент волшебной палочки в Photoshop:

convert original.jpg -alpha set -channel alpha -fuzz 18% \
-fill none -floodfill +0+0 black transparent-border.png

Вот команды с разбивкой:

convert original.jpg: запустить Imagemagick с исходным изображением

-alpha set: активировать альфа-канал

-channel alpha: последующие операторы действуют на альфа-канале

-fuzz 18%: см. -floodfill ...

-fill none: см. -floodfill ...

-floodfill +0+0 black: начните с верхнего левого угла (+0+0) и найдите соседние пиксели в пределах -fuzz цветового расстояния black и замените его на -fill

transparent-border.png: выходное изображение

Вот результат: Imagemagick Method 1

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

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

Если вы застряли с этими маленькими изображениями (или если вы просто хотите использовать другой метод), я бы порекомендовал пойти другим путем, где вы создадите свою собственную форму маски, которая будет чуть меньше, чем форма исходной фотографии, затем добавьте обратно свою собственную серую рамку. Я собрал пример этого процесса ниже.

Возможная команда для этого метода:

convert original.jpg mask.png -compose CopyOpacity -composite \
-compose src-over new-border.png -composite clean-result.png

... сломан ...

convert original.jpg mask.png: запустите Imagemagick с исходным изображением и добавьте в качестве второго слоя mask.png (mask.png - это белая прямоугольная форма фотографии на черном фоне, но она немного меньше, чем у оригинал - в результате будут удалены серая и черная граница оригинала).

-compose CopyOpacity -composite: используйте mask.png, чтобы «выбить» фигуру из оригинала .png

-compose src-over: сброс комбинированного метода на простое наложение

new-border.png -composite: наложение серой границы (png - это граница шириной 3 пикселя, 1 пиксель с каждой стороны от края маски на прозрачном фоне)

clean-result.png: выходное изображение

Я создал mask.png и new-border.png в Photoshop. Вы можете использовать векторные инструменты Imagemagick и делать все это в одной команде, используя только original.jpg, но это будет нелегко.

Результат вышеописанного: Imagemagick Method 2

В заключение, я не уверен, используете ли вы PHP Imagick или Imagemagick из командной строки. Несколько лет назад я попытался использовать Imagick, но быстро разочаровался в отсутствии документации по сравнению с командной строкой (хотя, возможно, это изменилось). Вместо этого я выполняю команды из PHP (например, из exec() или passthru()). Некоторые или многие другие, вероятно, скажут вам, что вы никогда не должны выполнять команды оболочки из PHP, но пока вы тщательно избегаете любых аргументов, я пока не вижу убедительного аргумента против этого. Тогда в вашем распоряжении будет вся документация Imagemagick (http://www.imagemagick.org/Usage/).

Приветствие.

...