Javascript.RU

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

Рисовалка JavaScript, функция штампа
Здравствуйте, подскажите пожалуйста. В рисовалке есть кнопка с выбором режима Штамп/Рисовать. Когда нажимаешь "Штамп" на кнопке отображается "Рисовать" и наоборот. И вот вопрос... Как задать кнопке "Штамп" функцию штампа, чтобы изображение солнца вставлялось туда, куда тыкнул по канвасу? И как должен выглядеть код в этом случае? Заранее, большое спасибо!

Вот код
<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>www</title>
  <link rel="stylesheet" href="style.css">
</head>
<body>
    <canvas id="jsCanvas" class="canvas"></canvas>  
  </div>
    <div class="controls">
      <div class="controls__range">
        <input type="range" id="jsRange" min="1.0" max="16.0" value="8.0" step="1.0">
      </div>
      <div class="controls__btns">
        <button id="jsMode">Рисовать</button>
        <button id="jsClear">Очистить</button>
        <button id="jsSave">Сохранить</button>
      </div>
        <div class="controls__colors" id="jsColors">
            <div class="controls__color jsColor" style="background-color:#0c0c0c"></div>
            <div class="controls__color jsColor" style="background-color:rgb(87, 87, 87)"></div>
            <div class="controls__color jsColor" style="background-color:white"></div>
            <div class="controls__color jsColor" style="background-color:red"></div>
            <div class="controls__color jsColor" style="background-color:orangered"></div>
            <div class="controls__color jsColor" style="background-color:yellow"></div>
            <div class="controls__color jsColor" style="background-color:green"></div>
            <div class="controls__color jsColor" style="background-color:rgb(0, 162, 232)"></div>
            <div class="controls__color jsColor" style="background-color:blue"></div>
            <div class="controls__color jsColor" style="background-color:purple"></div>
            <div class="controls__color jsColor" style="background-color:rgb(0, 255, 0)"></div>
            <div class="controls__color jsColor" style="background-color:fuchsia"></div>
        </div>
    </div>
  <script src="app.js"></script>
</body>
</html>


const btn = document.getElementById('jsClear');
const mode = document.getElementById('jsMode');
const canvas = document.getElementById('jsCanvas');
const colors = document.getElementsByClassName ('jsColor');
const ctx = canvas.getContext('2d');
const range = document.getElementById('jsRange');
let img = new Image();
img.src = "kotik.jpg";
window.addEventListener('load', function() {
  ctx.drawImage(img, 0, 0, 667, 667);
});

let painting = false;
let filling = false;

canvas.height=667;
canvas.width=667;
 
ctx.lineWidth = 8;
ctx.lineCap = "round";
ctx.strokeStyle = '#0c0c0c';

function onClear() {
    ctx.clearRect(0, 0, canvas.width, canvas.height);
    ctx.drawImage(img, 0, 0, 667, 667);
}

function handleColorClick(event){
  const color = event.target.style.backgroundColor;
  ctx.strokeStyle = color;
}

function handleRangeChange(event){
  const rangeValue = event.target.value;
  ctx.lineWidth = rangeValue;
}

function handleModeClick(){
  if (painting === true){
      painting = false;
      mode.innerText = 'Рисовать';
  } else {
    painting = true;
      mode.innerText = 'Штамп';
  }
  }

function drawIfPressed (e) {
      var x = e.offsetX;
      var y = e.offsetY;
      var dx = e.movementX;
      var dy = e.movementY;
 
      if (e.buttons > 0) {
        ctx.beginPath();
        ctx.moveTo(x, y);
        ctx.lineTo(x - dx, y - dy);
        ctx.stroke();
        ctx.closePath();
      }
}
 
canvas.addEventListener('mousemove', drawIfPressed);
btn.addEventListener('click', onClear);

Array.from(colors).forEach(color => color.addEventListener('click', handleColorClick));

if (range){
  range.addEventListener('input', handleRangeChange);
}

if (mode) {
  mode.addEventListener('click', handleModeClick);
}


вот изображение, которое должно быть штампом

Последний раз редактировалось wweelltt, 16.05.2022 в 20:10.
Ответить с цитированием
  #2 (permalink)  
Старый 16.05.2022, 20:30
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

canvas draw рисовалка
wweelltt,

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>www</title>
    <style type="text/css">
        .controls__color {
            width: 50px;
            height: 30px;
        }
        .controls__colors {
            display: flex;
        }
    </style>
</head>
<body>
    <canvas id="jsCanvas" class="canvas"></canvas>
    <div class="controls">
        <div class="controls__range">
            <input type="range" id="jsRange" min="1.0" max="16.0" value="8.0" step="1.0">
        </div>
        <div class="controls__btns">
            <button id="jsMode">Рисовать</button>
            <button id="jsClear">Очистить</button>
            <button id="jsSave">Сохранить</button>
        </div>
        <div class="controls__colors" id="jsColors">
            <div class="controls__color jsColor" style="background-color:#0c0c0c"></div>
            <div class="controls__color jsColor" style="background-color:rgb(87, 87, 87)"></div>
            <div class="controls__color jsColor" style="background-color:white"></div>
            <div class="controls__color jsColor" style="background-color:red"></div>
            <div class="controls__color jsColor" style="background-color:orangered"></div>
            <div class="controls__color jsColor" style="background-color:yellow"></div>
            <div class="controls__color jsColor" style="background-color:green"></div>
            <div class="controls__color jsColor" style="background-color:rgb(0, 162, 232)"></div>
            <div class="controls__color jsColor" style="background-color:blue"></div>
            <div class="controls__color jsColor" style="background-color:purple"></div>
            <div class="controls__color jsColor" style="background-color:rgb(0, 255, 0)"></div>
            <div class="controls__color jsColor" style="background-color:fuchsia"></div>
        </div>
    </div>
    <script>
        const btn = document.getElementById('jsClear');
        const mode = document.getElementById('jsMode');
        const canvas = document.getElementById('jsCanvas');
        const colors = document.getElementsByClassName('jsColor');
        const ctx = canvas.getContext('2d');
        const range = document.getElementById('jsRange');
        let img = new Image();
        img.src = "https://mdn.mozillademos.org/files/5397/rhino.jpg";
        window.addEventListener('load', function() {
            ctx.drawImage(img, 0, 0, 667, 667);
        });
        let painting = true;
        let filling = false;
        canvas.height = 667;
        canvas.width = 667;
        ctx.lineWidth = 8;
        ctx.lineCap = "round";
        ctx.strokeStyle = '#0c0c0c';
        function onClear() {
            ctx.clearRect(0, 0, canvas.width, canvas.height);
            ctx.drawImage(img, 0, 0, 667, 667);
        }
        function handleColorClick(event) {
            const color = event.target.style.backgroundColor;
            ctx.strokeStyle = color;
        }
        function handleRangeChange(event) {
            const rangeValue = event.target.value;
            ctx.lineWidth = rangeValue;
        }
        function handleModeClick() {
            if (painting === true) {
                painting = false;
                mode.innerText = 'Штамп';
            } else {
                painting = true;
                mode.innerText = 'Рисовать';
            }
        }
        var image = new Image;
        image.src = 'https://www.pinclipart.com/picdir/big/285-2856763_tangled-sun-png-clipart-transparent-png.png';
        function drawIfPressed(e) {
            var x = e.offsetX;
            var y = e.offsetY;
            var dx = e.movementX;
            var dy = e.movementY;
            if (e.buttons > 0) {
                if (painting) {
                    ctx.beginPath();
                    ctx.moveTo(x, y);
                    ctx.lineTo(x - dx, y - dy);
                    ctx.stroke();
                    ctx.closePath();
                } else {
                    var width = ctx.lineWidth * 5;
                    ctx.drawImage(image, x - dx - width / 2, y - dy - width / 2, width, width);
                }
            }
        }
        canvas.addEventListener('mousemove', drawIfPressed);
        btn.addEventListener('click', onClear);
        Array.from(colors).forEach(color => color.addEventListener('click', handleColorClick));
        if (range) {
            range.addEventListener('input', handleRangeChange);
        }
        if (mode) {
            mode.addEventListener('click', handleModeClick);
        }
    </script>
</body>
</html>

Последний раз редактировалось рони, 16.05.2022 в 20:37.
Ответить с цитированием
  #3 (permalink)  
Старый 16.05.2022, 22:49
Новичок на форуме
Отправить личное сообщение для wweelltt Посмотреть профиль Найти все сообщения от wweelltt
 
Регистрация: 16.05.2022
Сообщений: 7

рони,
Спасибо вам большое. А можете подсказать пожалуйста как эту функцию поменять, чтобы штамп срабатывал только там где я кликнул и не рисовался дальше при зажатой кнопке мыши. И чтобы он был всегда только с заданным размером, а не изменял свой размер от ползунка.
Ответить с цитированием
  #4 (permalink)  
Старый 16.05.2022, 23:14
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

wweelltt,
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>www</title>
    <style type="text/css">
        .controls__color {
            width: 50px;
            height: 30px;
        }
        .controls__colors {
            display: flex;
        }
    </style>
</head>
<body>
    <canvas id="jsCanvas" class="canvas"></canvas>
    <div class="controls">
        <div class="controls__range">
            <input type="range" id="jsRange" min="1.0" max="16.0" value="8.0" step="1.0">
        </div>
        <div class="controls__btns">
            <button id="jsMode">Рисовать</button>
            <button id="jsClear">Очистить</button>
            <button id="jsSave">Сохранить</button>
        </div>
        <div class="controls__colors" id="jsColors">
            <div class="controls__color jsColor" style="background-color:#0c0c0c"></div>
            <div class="controls__color jsColor" style="background-color:rgb(87, 87, 87)"></div>
            <div class="controls__color jsColor" style="background-color:white"></div>
            <div class="controls__color jsColor" style="background-color:red"></div>
            <div class="controls__color jsColor" style="background-color:orangered"></div>
            <div class="controls__color jsColor" style="background-color:yellow"></div>
            <div class="controls__color jsColor" style="background-color:green"></div>
            <div class="controls__color jsColor" style="background-color:rgb(0, 162, 232)"></div>
            <div class="controls__color jsColor" style="background-color:blue"></div>
            <div class="controls__color jsColor" style="background-color:purple"></div>
            <div class="controls__color jsColor" style="background-color:rgb(0, 255, 0)"></div>
            <div class="controls__color jsColor" style="background-color:fuchsia"></div>
        </div>
    </div>
    <script>
        const btn = document.getElementById('jsClear');
        const mode = document.getElementById('jsMode');
        const canvas = document.getElementById('jsCanvas');
        const colors = document.getElementsByClassName('jsColor');
        const ctx = canvas.getContext('2d');
        const range = document.getElementById('jsRange');
        let img = new Image();
        img.src = "https://mdn.mozillademos.org/files/5397/rhino.jpg";
        window.addEventListener('load', function() {
            ctx.drawImage(img, 0, 0, 667, 667);
        });
        let painting = true;
        let filling = false;
        canvas.height = 667;
        canvas.width = 667;
        ctx.lineWidth = 8;
        ctx.lineCap = "round";
        ctx.strokeStyle = '#0c0c0c';
        function onClear() {
            ctx.clearRect(0, 0, canvas.width, canvas.height);
            ctx.drawImage(img, 0, 0, 667, 667);
        }
        function handleColorClick(event) {
            const color = event.target.style.backgroundColor;
            ctx.strokeStyle = color;
        }
        function handleRangeChange(event) {
            const rangeValue = event.target.value;
            ctx.lineWidth = rangeValue;
        }
        function handleModeClick() {
            if (painting === true) {
                painting = false;
                mode.innerText = 'Штамп';
            } else {
                painting = true;
                mode.innerText = 'Рисовать';
            }
        }
        var image = new Image;
        image.src = 'https://www.pinclipart.com/picdir/big/285-2856763_tangled-sun-png-clipart-transparent-png.png';
        function drawIfPressed(e) {
            console.log(e.type)
            var x = e.offsetX;
            var y = e.offsetY;
            var dx = e.movementX;
            var dy = e.movementY;
            if (e.type == 'click' && !painting) {
                var width = 40;
                ctx.drawImage(image, x - width / 2, y - width / 2, width, width);
            } else if (e.buttons > 0 && painting) {
                ctx.beginPath();
                ctx.moveTo(x, y);
                ctx.lineTo(x - dx, y - dy);
                ctx.stroke();
                ctx.closePath();
            }
        }
        canvas.addEventListener('mousemove', drawIfPressed);
        canvas.addEventListener('click', drawIfPressed);
        btn.addEventListener('click', onClear);
        Array.from(colors).forEach(color => color.addEventListener('click', handleColorClick));
        if (range) {
            range.addEventListener('input', handleRangeChange);
        }
        if (mode) {
            mode.addEventListener('click', handleModeClick);
        }
    </script>
</body>
</html>
Ответить с цитированием
  #5 (permalink)  
Старый 17.05.2022, 00:01
Новичок на форуме
Отправить личное сообщение для wweelltt Посмотреть профиль Найти все сообщения от wweelltt
 
Регистрация: 16.05.2022
Сообщений: 7

рони,
Спасибо большое за помощь
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Бесплатный курс JavaScript (18 уроков)  Bokal Учебные материалы 2 16.11.2014 20:20
Функция корзины на javascript? kickboxer Общие вопросы Javascript 4 15.11.2014 20:06
нужна функция аналог slideToggle, только на Javascript Telnet jQuery 4 04.10.2011 11:43
Простая функция JavaScript. Задержка показа контента Mr.V Элементы интерфейса 2 11.08.2011 19:32
Первый Moscow JavaScript Meetup korenyushkin Общие вопросы Javascript 0 26.07.2011 15:23