Javascript.RU

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

Функция сохранить изображение canvas 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:#000000"></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');
const saveBtn = document.getElementById('jsSave');
let img = new Image();
img.src = "sky.jpg";
window.addEventListener('load', function() {
  ctx.drawImage(img, 0, 0, 540, 675);
});

let painting = false;

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

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

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 = 'sun.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();
}
}

function handleCM(event){
  event.preventDefault();
}

function handleSaveClick(){
  const Image = canvas.toDataURL('image/png');
  const link = document.createElement('a');
  link.href = Image;
  link.download = "download.png";
  link.click();
}

canvas.addEventListener('mousemove', drawIfPressed);
canvas.addEventListener('click', drawIfPressed);
canvas.addEventListener('contextmenu', handleCM);
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);
}

if (saveBtn){
  saveBtn.addEventListener('click', handleSaveClick);
}

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

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

рони,
А можно это как-то обойти или исправить?
Ответить с цитированием
  #4 (permalink)  
Старый 21.05.2022, 22:34
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

wweelltt,
не знаю, может кто-то ещё подскажет, как сохранить canvas.
Ответить с цитированием
  #5 (permalink)  
Старый 21.05.2022, 22:48
Новичок на форуме
Отправить личное сообщение для wweelltt Посмотреть профиль Найти все сообщения от wweelltt
 
Регистрация: 16.05.2022
Сообщений: 7

рони,
Хорошо, спасибо
Ответить с цитированием
  #6 (permalink)  
Старый 21.05.2022, 22:56
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

wweelltt,
сохранит, если совсем не использовать картинки ...
Ответить с цитированием
  #7 (permalink)  
Старый 22.05.2022, 01:12
Профессор
Отправить личное сообщение для Nexus Посмотреть профиль Найти все сообщения от Nexus
 
Регистрация: 04.12.2012
Сообщений: 3,719

wweelltt, я несколько лет назад для этих целей использовал FileSaver.js.
Ответить с цитированием
  #8 (permalink)  
Старый 22.05.2022, 04:31
Аватар для Gvozd
Матрос
Отправить личное сообщение для Gvozd Посмотреть профиль Найти все сообщения от Gvozd
 
Регистрация: 04.04.2008
Сообщений: 6,246

как минимум стоит добавить
image.crossOrigin = 'anonymous';


Вообще должен был ругнуться в консоли на tainted canvas, или вроде того, и по тексту ошибки в гугле уже полно информации
Ответить с цитированием
  #9 (permalink)  
Старый 22.05.2022, 07:53
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Gvozd,
Привет!

Сообщение от Gvozd
image.crossOrigin = 'anonymous';
картинки совсем показывать отказывается.
Ответить с цитированием
  #10 (permalink)  
Старый 22.05.2022, 07:55
Аватар для рони
Профессор
Отправить личное сообщение для рони Посмотреть профиль Найти все сообщения от рони
 
Регистрация: 27.05.2010
Сообщений: 33,068

Сообщение от wweelltt
А можно это как-то обойти или исправить?
Цитата:
Tainted canvas — канвас, на который выведен рисунок с другого домена. Некоторые операции (например, .toDataURL) с таким канвасом считаются нарушением same origin policy.
Для открытого локально файла любой другой домен считается нарушением same origin policy, отсюда и ошибка.
всё на сервер, в одну папку, картинки и код.
Ответить с цитированием
Ответ



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

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


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сохранить рисунок из canvas в .jpg clecar Общие вопросы Javascript 6 03.04.2018 14:18
Как сохранить данные в файл? Возможно такое на JavaScript? Forgott Общие вопросы Javascript 35 26.06.2015 19:11
Функция при наведении на Canvas объект max0n Общие вопросы Javascript 0 07.05.2013 17:56
Функция JavaScript со вставкой РНР Tariel Internet Explorer 9 18.12.2009 19:19
Как сохранить кеш в JavaScript Jumong Общие вопросы Javascript 4 20.07.2008 20:29