Сохранение изображения, нарисованного на холсте

У меня есть простое HTML-приложение, в котором я могу рисовать на холсте HTML5. У меня есть кнопка сохранения, где я делаю снимок с помощью canvas.todataURL. Когда я открываю эту ссылку в веб-браузере, отображается не весь рисунок, а только часть рисунка. Ниже мой код. Попробуйте, это не имеет смысла.

JSFIDDLE: https://jsfiddle.net/v0a2Lfsk/1/

<script src = "https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.1/jquery.js"></script>

<script>
var mousePressed = false;
var lastX, lastY;
var ctx;

$(window).on('load', function() { 
  canv = document.getElementById('myCanvas');
  ctx = canv.getContext("2d");
  canv.width  = $(window).width();
  canv.height = 1000;

  $('#myCanvas').mousedown(function (e) {
    mousePressed = true;
    //Draw(e.pageX - $(this).offset().left, e.pageY - $(this).offset().top, false);
    Draw(e.pageX, e.pageY, false);
  });

  $('#myCanvas').mousemove(function (e) {
    if (mousePressed) {
      //Draw(e.pageX - $(this).offset().left, e.pageY - $(this).offset().top, true);
      Draw(e.pageX , e.pageY , true);
    }
  });

  $('#myCanvas').mouseup(function (e) {
    mousePressed = false;
  });
  $('#myCanvas').mouseleave(function (e) {
    mousePressed = false;
  });


});

function Draw(x, y, isDown) {
  if (isDown) {
    ctx.beginPath();
    ctx.strokeStyle = "blue";
    ctx.lineWidth = $('#selWidth').val();
    ctx.lineJoin = "round";
    ctx.moveTo(lastX, lastY);
    ctx.lineTo(x, y);
    ctx.closePath();
    ctx.stroke();
  }
  lastX = x; lastY = y;
}

function next(){

    var canvas = document.getElementById('myCanvas');

    var image = canvas.toDataURL("image/png");  // here is the most important part because if you dont replace you will get a DOM 18 exception.
    console.info(image);

    // html2canvas(document.querySelector("#myCanvas")).then(canvas => {
    //     document.body.appendChild(canvas);
    //     alert("dasds");
    // });

}

function clearArea() {
  // Use the identity matrix while clearing the canvas
  ctx.setTransform(1, 0, 0, 1, 0, 0);
  ctx.clearRect(0, 0, ctx.canvas.width, ctx.canvas.height);
}
</script>
<body>
 <canvas id = "myCanvas"></canvas>
  <div class = "controls">     
    <button onclick = "javascript:clearArea();return false;">Clear Area</button>
    <button onclick = "javascript:next();return false;">Save (Print to Console Log)</button>
    <!-- Line width : <select id = "selWidth">
    <option value = "1">1</option>
    <option value = "3">3</option>
    <option value = "5" selected = "selected">5</option>
    <option value = "7">7</option>
    <option value = "9">9</option>
    <option value = "11">11</option>
    </select>
    Color : <select id = "selColor">
    <option value = "black">black</option>
    <option value = "blue" selected = "selected">blue</option>
    <option value = "red">red</option>
    <option value = "green">green</option>
    <option value = "yellow">yellow</option>
    <option value = "gray">gray</option>
    </select> -->
  </div>

</body>
  <style>
body{
  overflow:hidden;
}
#mycanvas
{
  background-color:#fff;
  position:absolute;
*/  background-repeat:   no-repeat;
}
.controls
{
  position:absolute;
  top:0px;
  right:0px;
  width: 600px;
  background-color:#2277dd;
  padding:5px;
  margin:2px;
  color:#fff;
  -webkit-border-radius: 3px;
  border-radius: 3px;
}
</style>

Я настоятельно рекомендую ознакомиться с документацией по этому поводу: developer.mozilla.org/en-US/docs/Web/API/HTMLCanvasElement/…

FeaturedSpace 31.05.2019 01:30

@FeaturedSpace Да, я это сделал и ТОЧНО следовал их коду. И все же это не сработало.

asdadsads 31.05.2019 01:32

Если я не ошибаюсь, я получаю полное изображение, когда копирую вывод консоли и вставляю его в Chrome 74 на своем Mac.

Devin 31.05.2019 01:34

var image = canvas.toDataURL("image/png"); И вы знаете, что это возвращает значение в кодировке base64, верно?

FeaturedSpace 31.05.2019 01:35

Какой?? Ни за что. Я также на Mac и на Chrome 74.

asdadsads 31.05.2019 01:36

Вы нарисовали большое изображение? Что происходит со мной, так это то, что я получаю только верхнюю часть изображения.

asdadsads 31.05.2019 01:36

@FeaturedSpace Да, я знаю, что это значение в кодировке base64. Я поместил это в свой URL-адрес браузера, чтобы посмотреть, как это выглядит.

asdadsads 31.05.2019 01:37

Попробуйте отобразить его, фактически выведя HTML? Может браузер неправильно интерпретирует

FeaturedSpace 31.05.2019 01:37

О чувак. Я только что понял это. Я никогда не нажимал кнопку "Показать больше"

asdadsads 31.05.2019 01:39

да. Черный квадрат — скриншот результата. imgur.com/a/TtzZgJL

Devin 31.05.2019 01:39

Если кто-то хочет добавить ответ, я приму его. Я не заметил кнопку Показать больше. Я просто скопировал подраздел. АГРГГГРГ

asdadsads 31.05.2019 01:39
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
3
11
577
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Убедитесь, что вы нажали кнопку «Показать больше» на вкладке «Консоль» инструментов разработчика, иначе вы можете скопировать только часть выходной строки (согласно комментарию asdadsads).

В некоторых случаях показ обрезанной строки base64 приведет к сообщению об ошибке, а в других (например, у вас) будет отображаться часть изображения.

В качестве альтернативы просто используйте кнопку «Копировать», которая скопирует весь вывод.

Другие вопросы по теме