Я хочу взять фрагмент неправильной формы из существующего изображения и отобразить его как новое изображение в Javascript, используя холсты HTML5. Таким образом, будут скопированы только данные внутри границы многоугольника. Подход, который я придумал, включал:
- Нарисуйте многоугольник на новом холсте.
- Создать маску, используя
clip
- Скопируйте данные с оригинального холста, используя
getImageData
(прямоугольник)
- Применить данные к новому холсту, используя
putImageData
Это не сработало, весь прямоугольник (например, материал из источника за пределами границы) все еще появляется. Этот вопрос объясняет, почему:
«В спецификации сказано, что putImageData
не будет затронут отсечкой регионов». Dang!
Я также попытался нарисовать фигуру, установив context.globalCompositeOperation = "source-in"
, а затем используя putImageData
. Результат тот же: маска не применяется. Я подозреваю, что по той же причине.
Любые предложения о том, как достичь этой цели? Вот основной код моей работы, на случай, если неясно, что я пытаюсь сделать. .
// coords is the polygon data for the area I want
context = $('canvas')[0].getContext("2d");
context.save();
context.beginPath();
context.moveTo(coords[0], coords[1]);
for (i = 2; i < coords.length; i += 2) {
context.lineTo(coords[i], coords[i + 1]);
}
//context.closePath();
context.clip();
$img = $('#main_image');
copy_canvas = new_canvas($img); // just creates a new canvas matching dimensions of image
copy_ctx = copy.getContext("2d");
tempImage = new Image();
tempImage.src = $img.attr("src");
copy_ctx.drawImage(tempImage,0,0,tempImage.width,tempImage.height);
// returns array x,y,x,y with t/l and b/r corners for a polygon
corners = get_corners(coords)
var data = copy_ctx.getImageData(corners[0],corners[1],corners[2],corners[3]);
//context.globalCompositeOperation = "source-in";
context.putImageData(data,0,0);
context.restore();