Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 22.01.2017, 12:04
Аспирант
Отправить личное сообщение для provigator Посмотреть профиль Найти все сообщения от provigator
 
Регистрация: 20.01.2017
Сообщений: 32

<canvas> маска для картинки
есть 3 картинки на холсте:
pic1 = new Image()
	pic1.src = 'image1.png'  // черный квадрат
	pic2 = new Image()
	pic2.src = 'image2.png'  // синий квадрат
	pic3 = new Image()
	pic3.src = 'image3.png'  // круг
		
	pic3.onload = function() {				
		mask()
	}

	function mask() {
		ctx.drawImage(pic1, 0, 0)
		ctx.drawImage(pic2, 0, 0)
		ctx.drawImage(pic3, 75, 0)
	}



надо сделать маску в форме круга для синего квадрата:
pic1 = new Image()
	pic1.src = 'image1.png'  // черный квадрат
	pic2 = new Image()
	pic2.src = 'image2.png'  // синий квадрат
	pic3 = new Image()
	pic3.src = 'image3.png'  // круг
		
	pic3.onload = function() {				
		mask()
	}
	function mask() {
		ctx.drawImage(pic1, 0, 0)
		ctx.drawImage(pic2, 0, 0)
		ctx.globalCompositeOperation = 'destination-in'   // destination-in — отображается только та часть изображения, где фигуры пересекаются. Сверху старое изображение
		ctx.drawImage(pic3, 75, 0)
	}

в результате круг маскирует все изображение на холсте:


как сделать маску только для синего квадрата?
так чтобы черный выводился полностью

globalCompositeOperation
определяет как будут себя вести перекрывающиеся фигуры
http://xiper.net/manuals/canvas/2D-a...ositeOperation

Последний раз редактировалось provigator, 22.01.2017 в 13:51.
Ответить с цитированием
  #2 (permalink)  
Старый 22.01.2017, 12:42
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

provigator, "старое изображение" это изображение всего холста, а не то которое ты отрисовал последним.
function mask() {
    ctx.drawImage(pic2, 0, 0);
    ctx.globalCompositeOperation = 'destination-out';
    ctx.drawImage(pic3, 75, 0);
    ctx.globalCompositeOperation = 'destination-over';
    ctx.drawImage(pic1, 0, 0);
    ctx.globalCompositeOperation = 'source-over';
}

Последний раз редактировалось Rise, 22.01.2017 в 12:47.
Ответить с цитированием
  #3 (permalink)  
Старый 22.01.2017, 13:18
Аспирант
Отправить личное сообщение для provigator Посмотреть профиль Найти все сообщения от provigator
 
Регистрация: 20.01.2017
Сообщений: 32

ctx.drawImage(pic1, 0, 0)
        ctx.drawImage(pic2, 0, 0)
        ctx.globalCompositeOperation = 'destination-out'  
        ctx.drawImage(pic3, 75, 0)



ctx.globalCompositeOperation = 'destination-out'
оставляет все что находится вне круга, область внутри круга делает прозрачной

задача: маскировать кругом только синий квадрат - вывести ту часть где они пересекаются, черный квадрат не должен маскироваться



этот скрин сделал во флеше с помощью слоев
Ответить с цитированием
  #4 (permalink)  
Старый 22.01.2017, 13:37
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,662

provigator, замени out на in в моем примере тогда.
Ответить с цитированием
  #5 (permalink)  
Старый 22.01.2017, 14:16
Аспирант
Отправить личное сообщение для provigator Посмотреть профиль Найти все сообщения от provigator
 
Регистрация: 20.01.2017
Сообщений: 32

окей,
function mask() {
	ctx.drawImage(pic2, 0, 0)
	ctx.globalCompositeOperation = 'destination-in'
	ctx.drawImage(pic3, 75, 0)
	ctx.globalCompositeOperation = 'destination-over'
	ctx.drawImage(pic1, 0, 0)
	ctx.globalCompositeOperation = 'source-over'
}



работает, буду разбираться...
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Поле для ввода телефона. При потери фокуса поля, маска прячется DDim1000 Общие вопросы Javascript 1 23.11.2016 20:02
Плагин для картинки Алсу199 (X)HTML/CSS 0 23.07.2014 22:57
Обясните задержку Faab jQuery 11 15.06.2013 09:32
поиск классов внутри тега yozuul jQuery 24 14.06.2013 22:00