Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 05.11.2018, 21:05
Новичок на форуме
Отправить личное сообщение для Михаил_ Посмотреть профиль Найти все сообщения от Михаил_
 
Регистрация: 05.11.2018
Сообщений: 7

Canvas. Манипуляции с большим изображением
Всех приветствую. Нужна помощь.
Есть canvas 500 х 500
Есть слой с картинкой 2000 х 1500.
Не получается сделать вращение слоя с картинкой в центре canvas-a после перемещений этого слоя.
Нужно дать возможность выбрать любой участок изображения, развернуть его, как понадобится, с возможностью масштабирования без ограничения повторов этих действий.
Чувствую, что дело в тригонометрии, но не могу ни как решить эту задачу
Наверняка уже кто-то с таким сталкивался, очень нужна помощь
Ответить с цитированием
  #2 (permalink)  
Старый 05.11.2018, 21:28
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,112

Михаил_,
подожду переводчика или пример.
Ответить с цитированием
  #3 (permalink)  
Старый 05.11.2018, 21:43
Новичок на форуме
Отправить личное сообщение для Михаил_ Посмотреть профиль Найти все сообщения от Михаил_
 
Регистрация: 05.11.2018
Сообщений: 7

Сообщение от рони Посмотреть сообщение
Михаил_,
подожду переводчика или пример.
Я бы с удовольствием предоставил пример, но рабочего нет Все работает только по отдельности, а вот после вращения и перемещения повторное и последующие вращение в центре canvas-a не получается не уловлю, как использовать translate. Я воспользовался вращением слоя из-за необходимости в дальнейшем размещать там дополнительные объекты и работать с ними на выбранном участке изображения.
Это мой первый опыт с canvas-ом, но все равно не ожидал, что упрусь так плотно
Ответить с цитированием
  #4 (permalink)  
Старый 05.11.2018, 22:22
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,112

Михаил_,
я не понимаю что вы хотите сделать.
Ответить с цитированием
  #5 (permalink)  
Старый 06.11.2018, 01:32
Новичок на форуме
Отправить личное сообщение для Михаил_ Посмотреть профиль Найти все сообщения от Михаил_
 
Регистрация: 05.11.2018
Сообщений: 7

Сообщение от рони Посмотреть сообщение
Михаил_,
я не понимаю что вы хотите сделать.
Спасибо, огромное за попытку помочь. Извините, если не очень понятно изъясняюсь.
В canvas-e показывается участок большого изображения, пользователь выбирает нужный ему участок по своему усмотрению перемещая, вращая, масштабируя большое изображение. Размеры canvas-a не изменяются.
При начальной загрузке картинки, центр canvas-a и центр картинки совмещены.

У меня все уперлось в совмещение центра canvas-a и центра вращения большого изображения после однократного перемещения и поворота картинки.

Удалось решить эту проблему для однократного перемещения и поворота изображения, но после повторного перемещения совместить центр canvas-a и новый центр вращения картинки не получается ну ни как.

Не могу понять алгоритм совмещения центра canvas-a с новым центром вращения изображения после многократных перемещений и вращений, пока без масштабирования, даже. Учитывая, что предыдущий центр вращения картинки может быть смещен, при ее перемещении пользователем, далеко за рамки canvas-a

Уже мозги кипят. Повторюсь, картинка размещена в отдельном слое в canvas-e

Последний раз редактировалось Михаил_, 06.11.2018 в 01:52.
Ответить с цитированием
  #6 (permalink)  
Старый 06.11.2018, 02:09
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,112

Михаил_,
не могу помочь, не понимаю.
Ответить с цитированием
  #7 (permalink)  
Старый 06.11.2018, 10:38
Аватар для MallSerg
Профессор
Отправить личное сообщение для MallSerg Посмотреть профиль Найти все сообщения от MallSerg
 
Регистрация: 07.03.2011
Сообщений: 1,138

Сообщение от рони Посмотреть сообщение
Михаил_,
не могу помочь, не понимаю.
У топик стартера есть большая картинка на которую он смотрит через маленькое окно. Большую картинку на которую смотрят через окно можно перемещать и вращать точкой вращения является центр окна 500х500. Топик стартер не знает как найти точку( на большой фоновой картинке) вокруг которой нужно поворачивать эту картинку если большая картинка уже смещалась и вращалась.

Автор ищет синус и не может найти )). Ну а по хорошему такие задачи правильно решать с помощью сложения матриц трансформации после каждой операции смещения вращения.
Ответить с цитированием
  #8 (permalink)  
Старый 06.11.2018, 10:47
Новичок на форуме
Отправить личное сообщение для Михаил_ Посмотреть профиль Найти все сообщения от Михаил_
 
Регистрация: 05.11.2018
Сообщений: 7

Сообщение от MallSerg Посмотреть сообщение
У топик стартера есть большая картинка на которую он смотрит через маленькое окно. Большую картинку на которую смотрят через окно можно перемещать и вращать точкой вращения является центр окна 500х500. Топик стартер не знает как найти точку( на большой фоновой картинке) вокруг которой нужно поворачивать эту картинку если большая картинка уже смещалась и вращалась.
Да, Вы абсолютно правильно поняли!!!
Сообщение от MallSerg Посмотреть сообщение
Автор ищет синус и не может найти )). Ну а по хорошему такие задачи правильно решать с помощью сложения матриц трансформации после каждой операции смещения вращения.
Прошу прощения, а что это такое???
И вопрос, можно ли будет, после решения всех этих проблем сохранять текущее положение изображения, центров и других объектов с возможностью последующей загрузки? Без этого все усилия теряют смысл
Ответить с цитированием
  #9 (permalink)  
Старый 06.11.2018, 11:00
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 1,714

Примерно так...
<!DOCTYPE html>
<html>
	<head>
		<style>

canvas {
	background: black;
}

form {
	display: grid;
	grid-template-columns: 1fr 2fr;
	margin: 1em;
	align-self: flex-start;
	align-items: center;
	grid-gap: .5em;
}

form label {
	display: contents;
}

body {
	display: flex;
	flex-flow: wrap;
}		

		</style>
	</head>
	<body>
		<canvas id="canvas" width="500" height="500"></canvas>
		<form>
			<label>
				angle
				<input type="range" id="angle" value="0" min="-180" max="180" step="any">
			</label>
			<label>
				cropX
				<input type="number" id="cropX" value="850" step="1">
			</label>
			<label>
				cropY
				<input type="number" id="cropY" value="600" step="1">
			</label>
			<label>
				cropWidth
				<input type="number" id="cropWidth" value="300" step="1">
			</label>
			<label>
				cropHeight
				<input type="number" id="cropHeight" value="300" step="1">
			</label>
			<label>
				scale
				<input type="range" id="scale" value="1" min="0.1" max="5" step="any">
			</label>
		</form>

		<script>
			
var ctx = document.getElementById("canvas").getContext("2d");

var image = new Image();
image.src = "https://placeimg.com/2000/1500/any";
image.onload = applyInputs;

document.addEventListener("input", applyInputs);

function applyInputs() {
	crop(ctx, image, $.reduce((m, { id, value }) => Object.assign(m, { [id]: value }), {}));
}

var $ = "cropX cropY cropWidth cropHeight scale angle"
	.split(/\s+/)
	.map(id => document.getElementById(id));

function crop(ctx, image, { cropX, cropY, cropWidth, cropHeight, scale, angle }) {
	ctx.save();
	ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
	ctx.translate(.5 * ctx.canvas.width, .5 * ctx.canvas.height);
	ctx.rotate(angle * Math.PI / 180);

	ctx.save();
	ctx.globalAlpha = 0.125;
	ctx.scale(scale, scale);
	ctx.translate(-.5 * cropWidth - cropX, -.5 * cropHeight - cropY);
	ctx.drawImage(image, 0, 0, image.width, image.height, 0, 0, image.width, image.height);
	ctx.restore();

	ctx.save();
	ctx.scale(scale, scale);
	ctx.translate(-.5 * cropWidth - cropX, -.5 * cropHeight - cropY);
	ctx.drawImage(image, cropX, cropY, cropWidth, cropHeight, cropX, cropY, cropWidth, cropHeight);
	ctx.restore();

	ctx.restore();
}

		</script>
	</body>
</html>


В общем главная тут функция crop (строки 77-97), остальное чтобы показать, как оно действует

Если это действует так как нужно, то достаточно сохранить { cropX, cropY, cropWidth, cropHeight, scale, angle }, чтобы потом заново восстановить картинку.

Последний раз редактировалось Malleys, 06.11.2018 в 11:07.
Ответить с цитированием
  #10 (permalink)  
Старый 06.11.2018, 11:31
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,112

всем спасибо ...
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Canvas функции и JQ Tanya51 Общие вопросы Javascript 3 29.07.2017 12:56
Петербург: Javascript + Canvas. Разработчик для портирования игры. В офис. waxattack Работа 0 21.07.2016 14:06
Повтор фото (getUserMedia(),HTML5 Canvas) aspex Элементы интерфейса 1 27.12.2014 16:46
Создание экземпляра Canvas не затрагивая HTML Tails Общие вопросы Javascript 2 09.03.2012 13:55
Добавить на canvas еще один елемент greengarlic Общие вопросы Javascript 5 22.09.2010 10:16