Andy_z,
Картинка всегда сохраняется в виде прямоугольника. Если полигон будет, например, треугольный, то что должно быть за его пределами? Прозрачная область?
Если так, то примерный алгоритм:
1) Для полигона определить
top (y-координату самого верхнего угла),
left (х-координату самого левого угла),
width (разницу между самым левым и самым правым углом) и
height (аналогично)
2) Координаты полигона сдвинуть на
-left и
-top, чтобы он примыкал к осям и находился в положительной четверти плоскости.
3) Создать канву с размерами
width и
height
4) На ней сделать path по уже сдвинутому полигону (он как раз впишется в канву по размерам)
5) Вызвать
clip - теперь рисование возможно только внутри полигона
6) Кинуть картинку на канву:
ctx.drawImage(image, left, top, width, height, 0, 0, width, height);
Всё, картинка отрисовалась внутри полигона, снаружи прозрачный фон, можно сохранять через canvas.toBlob и ссылку с атрибутом download, либо этот же блоб кинуть на сервер.