Обрезать лицо / голову, используя овальные / многоугольные формы без использования вспышки?(ajax или html5?) - PullRequest
1 голос
/ 15 марта 2011

Моя миссия - позволить пользователям загружать свои собственные фотографии, затем сайт обрезает лицо и волосы и вставляет их в открытку. Сложность в том, что мне не разрешено использовать flash = /

Я понимаю, что существуют решения для распознавания лиц ajax или js, но что меня озадачивает, так это как обрезать шаблон странной формы. Imagemagick / graphicsmagick, как я знаю, может обрезать только объект прямоугольной или квадратной формы (пожалуйста, исправьте меня, если я ошибаюсь). Будет ли это в значительной степени разрушать всю идею, пока у меня не появится возможность обрезать странные формы? или есть другие способы обрезать круги или полигоны?

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

У меня заканчиваются идеи: (

1 Ответ

1 голос
/ 16 марта 2011

Я только что успешно создал кадрирование :), хотя и не идеально, он должен работать в Android или Iphone / Ipad.

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

Затем используйте координаты для imagemagick, кажется, что, хотя IM на самом деле не обрезает странные фигуры, он может, однако, использовать «маску» для преобразования bg фотографии, комбинируя трафарет (где мы рисуем линии, используя наши координаты, заполните bg цветом # 000000) и оригинальной фотографией.

Результатом должен быть урожай, который мы ищем :) теперь мы добавили немного растушевки, так как это немного круто. Все это с помощью imagemagick.

Теперь все, что нам нужно, это более кривые линии, так как я использовал «путь» в IM, который на самом деле не обеспечивает плавного кадрирования. Кто-то предложил использовать «кубические кривые», но может потребоваться дополнительное кодирование, поскольку для каждой координаты нужны некоторые параметры.

Эта команда создаст наш трафарет (длинные числа - это наши координаты):

convert -size 450x125 xc:black -fill white -stroke black -draw "path 'M +60+9 +94+18 +96+19 +84+27 +92+36 +97+43 +103+56 +102+58 +109+66 +109+74 +101+68 +98+76 +98+84 +95+88 +98+91 +106+95 +110+99 +111+103 +99+106 +89+108 +73+112 +56+109 +40+109 +26+103 +37+97 +46+91 +48+88 +39+80 +36+71 +32+78 +27+72 +30+61 +35+55 +42+41 +30+37 +40+24 +51+14 +156+9 +197+6 +236+8 +269+16 +265+36 +248+50 +222+52 +213+35 +198+24 +174+18 +155+13 +60+9'" stencil.gif

Затем мы скомбинируем трафарет с исходным изображением (что должно привести к нашему прозрачному «кадрированию»):

convert original.jpg stencil.gif -alpha off -compose CopyOpacity -composite combined.png

Наконец мы вычеркнем края:

convert combined.png -alpha set -virtual-pixel transparent -channel A -blur 0x0.7 -level 50,100% +channel -background none -flatten final.png

Вот как это работает сейчас: https://lh6.googleusercontent.com/_2lSoW37_zqo/TYCD65Vu4zI/AAAAAAAAEcc/vjlCPM54FTI/s800/theoryinpractice.jpg

Вот и все, надеюсь, это кому-нибудь поможет.

...