2012-05-16 6 views
3

Используя javascript, я нарисовал несколько изображений многоугольника на моем холсте.Есть ли способ очистить не прямоугольную область в элементе холста?

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

Итак, я не могу использовать clearRect() для своей цели.

Может ли кто-нибудь думать о том, как я могу это сделать?

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

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

ответ

6

Используйте ctx.clip(), чтобы определить текущий ход в качестве области отсечения.

См https://developer.mozilla.org/en/Canvas_tutorial/Compositing

Я также создал демо на http://jsfiddle.net/alnitak/6ABp7/

Путь отсечения является частью графического состояния, так что вы можете .save() предыдущее состояние, установить вырезку, сделать еще несколько вещей, а затем .restore() исходное состояние.

+1

Alnitak, это интересно. Я действительно наткнулся на этот учебник, пока я читал, прежде чем публиковать здесь, и уже проверил следующее, что не сработало: ctx.clip(); ctx.clearRect (0,0, ctx.width, ctx.height) ;. Видите ли, я предположил, что если сначала закрепить, тогда только эта область будет очищена (не весь прямоугольник), но ничего не произошло, когда я сделал это (и, кроме того, я не знаю, как отключить мой регион после этого). Что у тебя было на уме? Я предполагаю, что это не то, что я пытался. Как использовать клип для CLEAR моего региона ... –

+0

@Boriana см. Обновленный ответ. Возможно, вы не работали, потому что вы использовали 'ctx.width' вместо' canvasElement.width' – Alnitak

+0

Вы были правы! Теперь он отлично работает :-). Я действительно использовал неправильную ширину и высоту в clearRect(). Я должен был это сразу увидеть. Спасибо за подробный ответ и отличную демонстрацию. –