Еще один вопрос, как я могу сохранить изображение, полученное в этом теге, на сервер. Любое предположение ??
Сурия
7
Но если я использую var img = canvas.toDataURL ("image / jpeg"); Я получаю фон как полностью черный. Как это исправить
гаути
181
Ох, давай. Я ответил на это в 2009 году. Что вы ожидаете?
Donohoe
35
@donohoe на самом деле вы ответили на это в августе 2010 года :)
ник
13
Было бы гораздо меньше памяти, чтобы сделать что-то вроде var img = new Image(); img.src = canvas.toDataURL(); document.body.appendChild(img);. document.writeКод делает URL данных, их делает HTML строку, затем положить копию этой строки в DOM, браузер , то есть разобрать , что HTML - строку, поставить еще одну копию на элемент изображения, а затем разобрать его снова , чтобы включить URL данных в данные изображения, то, наконец, он может показать изображение. Для изображения с размером экрана это огромный объем памяти / копирование / анализ. Просто предложение
Ган
116
HTML5 предоставляет Canvas.toDataURL (mimetype), который реализован в бета-версиях Opera, Firefox и Safari 4. Однако существует ряд ограничений безопасности (в основном для рисования контента из другого источника на холсте).
Так что вам не нужна дополнительная библиотека.
например
<canvas id=canvas width=200 height=200></canvas><script>
window.onload =function(){var canvas = document.getElementById("canvas");var context = canvas.getContext("2d");
context.fillStyle ="green";
context.fillRect(50,50,100,100);// no argument defaults to image/png; image/jpeg, etc also work on some// implementations -- image/png is the only one that must be supported per spec.
window.location = canvas.toDataURL("image/png");}</script>
Теоретически это должно создать и затем перейти к изображению с зеленым квадратом в середине, но я не проверял.
Где изображение будет сохранено. Расположение в моем местном?
chinna_82
5
изображение будет отображаться как изображение в вашем браузере. Затем вы можете сохранить его на диск или что-то еще. Вот быстрый и грязный универсальный букмарклет «Canvas2PNG», который преобразует первый холст на странице в PNG и отображает его в браузере в новом окне:javascript:void(window.open().location = document.getElementsByTagName("canvas")[0].toDataURL("image/png"))
Кай Карвер,
Если размер изображения составляет несколько МБ, подготовьтесь к сбою браузера (я делал это некоторое время назад в FireFox).
Джаху
1
Как это можно изменить, чтобы сделать несколько изображений?
Менталист
URI данных имеют максимальную длину, поэтому существует верхний предел размера изображения, которое вы можете поместить в URL данных.
Юха Сирьяля
44
Я подумал, что немного расширю сферу этого вопроса с некоторыми полезными тонкостями по этому вопросу.
Чтобы получить холст как изображение, вам необходимо сделать следующее:
var canvas = document.getElementById("mycanvas");var image = canvas.toDataURL("image/png");
Вы можете использовать это для записи изображения на страницу:
document.write('<img src="'+image+'"/>');
Где "image / png" - это тип MIME (png - единственный, который должен поддерживаться). Если вам нужен массив поддерживаемых типов, вы можете сделать что-то вроде этого:
var imageMimes =['image/png','image/bmp','image/gif','image/jpeg','image/tiff'];//Extend as necessary var acceptedMimes =newArray();for(i =0; i < imageMimes.length; i++){if(canvas.toDataURL(imageMimes[i]).search(imageMimes[i])>=0){
acceptedMimes[acceptedMimes.length]= imageMimes[i];}}
Вам нужно запускать это только один раз для каждой страницы - это никогда не должно меняться в течение жизненного цикла страницы.
Если вы хотите, чтобы пользователь загружал файл в сохраненном виде, вы можете сделать следующее:
var canvas = document.getElementById("mycanvas");var image = canvas.toDataURL("image/png").replace("image/png","image/octet-stream");//Convert image to 'octet-stream' (Just a download, really)
window.location.href = image;
Если вы используете это с разными типами MIME, обязательно измените оба экземпляра image / png, но не image / octet-stream. Также стоит упомянуть, что если вы используете какие-либо междоменные ресурсы для рендеринга вашего холста, вы столкнетесь с ошибкой безопасности при попытке использовать метод toDataUrl.
С вашим решением для загрузки файла, я должен выбрать программное обеспечение, которое я хочу использовать, это немного неудобно ... Есть ли способ заменить mime на png после загрузки?
So4ne
1
@ So4ne Я так не думаю, это должен быть поток изображений / октетов, чтобы предложить пользователю загрузить файл. Если вы избавитесь от этой строки, вы получите страницу, перенаправляющую на изображение. Я хотел бы знать, если кто-то еще знает способ сделать это красиво, хотя.
meiamsome
2
используя target = "_ blank" для ссылки <a> и .click (), он также должен работать, чтобы инициировать загрузку (проверено с помощью data-url FF и download = "filename" для text / csv и text / plain)
Ax3l
Это замечательно. Спасибо! Но что, если я хочу сохранить на сервере, а не локально? Примет ли входной файл формы файл img src для загрузки?
Главный алхимик
К сожалению. Просто нашел ответ. Оставляя предыдущий вопрос на тот случай, если кто-то другой тоже хорошо смотрится на stackoverflow.com/questions/13198131/…
Сохраненный файл остается в формате .svg. Как сохранить его как PNG?
nullpointer
Это хорошее решение за исключением того, что оно может не работать в IE. Получение ошибки «Область данных, переданная системному вызову, слишком мала»
Хосе Чериан,
В Chrome написано «Ошибка сети», а в Firefox - отлично работает. (В Linux)
Ecker00
20
Я бы использовал " wkhtmltopdf ". Это просто отлично работает. Он использует движок webkit (используется в Chrome, Safari и т. Д.), И его очень легко использовать:
Я тоже в лагере wkhtmltopdf. Мы использовали его для архивирования и его УДИВИТЕЛЬНОГО.
Даниэль Сзабо
Как использовать WKHTMLtoPDF на странице, требующей информацию для входа? Я использую Jsreport для преобразования в PDF, но я захватываю свой контент с помощью HTML2Canvas, у меня проблема с отправкой Canvas в качестве параметра в JSreport
Вот некоторая помощь, если вы выполняете загрузку через сервер (таким образом вы можете назвать / конвертировать / постобработать / и т. Д. Свой файл):
Еще одно интересное решение - PhantomJS . Это безголовый сценарий WebKit с JavaScript или CoffeeScript.
Одним из вариантов использования является захват экрана: вы можете программно захватывать веб-содержимое, включая SVG и Canvas, и / или создавать снимки экрана веб-сайта с предварительным просмотром миниатюр.
Лучшей точкой входа является вики-страница захвата экрана .
Вот хороший пример для полярных часов (от RaphaelJS):
+1: PhantomJS - простая, хорошо документированная и продуманная система, идеально подходящая для этой работы. Это позволяет гораздо больше, чем просто захват холста - например, вы можете изменить страницу или ее часть (с помощью JS) перед захватом, чтобы она выглядела именно так, как вы этого хотите. Отлично!
Джондо
1
PhantomJs теперь устарел
Merc
3
Если вы используете jQuery, что делают многие, то вы бы реализовали принятый ответ следующим образом:
var canvas = $("#mycanvas")[0];var img = canvas.toDataURL("image/png");
$("#elememt-to-write-to").html('<img src="'+img+'"/>');
Чистым (100%) решением jQuery является следующее: $('<img>').attr('src',$('#mycanvas')[0].toDataURL('image/png')).appendTo($('#element-to-write-to').empty());ровно одна строка.
Наиль Максудов
1
Вы можете использовать jspdf для захвата холста в изображение или PDF, например:
var imgData = canvas.toDataURL('image/png');var doc =new jsPDF('p','mm');
doc.addImage(imgData,'PNG',10,10);
doc.save('sample-file.pdf');
Это другой способ, без строк, хотя я не знаю, быстрее это или нет. Вместо toDataURL (как предлагают все вопросы). В моем случае я хочу предотвратить dataUrl / base64, так как мне нужен буфер массива или представление. Таким образом, другой метод в HTMLCanvasElement есть toBlob. (Функция TypeScript):
exportfunction canvasToArrayBuffer(canvas:HTMLCanvasElement, mime: string):Promise<ArrayBuffer>{returnnewPromise((resolve, reject)=> canvas.toBlob(async(d)=>{if(d){const r =newFileReader();
r.addEventListener('loadend', e =>{const ab = r.result;if(ab){
resolve(ab as ArrayBuffer);}else{
reject(newError('Expected FileReader result'));}}); r.addEventListener('error', e =>{
reject(e)});
r.readAsArrayBuffer(d);}else{
reject(newError('Expected toBlob() to be defined'));}}, mime));}
Еще одним преимуществом больших двоичных объектов является то, что вы можете создавать ObjectUrls для представления данных в виде файлов, аналогично элементу «files» в HTMLInputFile. Больше информации:
Ответы:
К сожалению. Оригинальный ответ был конкретным для аналогичного вопроса. Это было пересмотрено:
со значением в IMG вы можете записать его в виде нового изображения следующим образом:
источник
var img = new Image(); img.src = canvas.toDataURL(); document.body.appendChild(img);
.document.write
Код делает URL данных, их делает HTML строку, затем положить копию этой строки в DOM, браузер , то есть разобрать , что HTML - строку, поставить еще одну копию на элемент изображения, а затем разобрать его снова , чтобы включить URL данных в данные изображения, то, наконец, он может показать изображение. Для изображения с размером экрана это огромный объем памяти / копирование / анализ. Просто предложениеHTML5 предоставляет Canvas.toDataURL (mimetype), который реализован в бета-версиях Opera, Firefox и Safari 4. Однако существует ряд ограничений безопасности (в основном для рисования контента из другого источника на холсте).
Так что вам не нужна дополнительная библиотека.
например
Теоретически это должно создать и затем перейти к изображению с зеленым квадратом в середине, но я не проверял.
источник
javascript:void(window.open().location = document.getElementsByTagName("canvas")[0].toDataURL("image/png"))
Я подумал, что немного расширю сферу этого вопроса с некоторыми полезными тонкостями по этому вопросу.
Чтобы получить холст как изображение, вам необходимо сделать следующее:
Вы можете использовать это для записи изображения на страницу:
Где "image / png" - это тип MIME (png - единственный, который должен поддерживаться). Если вам нужен массив поддерживаемых типов, вы можете сделать что-то вроде этого:
Вам нужно запускать это только один раз для каждой страницы - это никогда не должно меняться в течение жизненного цикла страницы.
Если вы хотите, чтобы пользователь загружал файл в сохраненном виде, вы можете сделать следующее:
Если вы используете это с разными типами MIME, обязательно измените оба экземпляра image / png, но не image / octet-stream. Также стоит упомянуть, что если вы используете какие-либо междоменные ресурсы для рендеринга вашего холста, вы столкнетесь с ошибкой безопасности при попытке использовать метод toDataUrl.
источник
источник
Я бы использовал " wkhtmltopdf ". Это просто отлично работает. Он использует движок webkit (используется в Chrome, Safari и т. Д.), И его очень легко использовать:
Это оно!
Попробуй это
источник
Вот некоторая помощь, если вы выполняете загрузку через сервер (таким образом вы можете назвать / конвертировать / постобработать / и т. Д. Свой файл):
-Пост данных с помощью
toDataURL
-Установите заголовки
создать изображение
-экспорт изображения в формате JPEG
или как прозрачный PNG
источник
Еще одно интересное решение - PhantomJS . Это безголовый сценарий WebKit с JavaScript или CoffeeScript.
Одним из вариантов использования является захват экрана: вы можете программно захватывать веб-содержимое, включая SVG и Canvas, и / или создавать снимки экрана веб-сайта с предварительным просмотром миниатюр.
Лучшей точкой входа является вики-страница захвата экрана .
Вот хороший пример для полярных часов (от RaphaelJS):
Вы хотите сделать страницу в PDF?
источник
Если вы используете jQuery, что делают многие, то вы бы реализовали принятый ответ следующим образом:
источник
.toDataURL
это родной JS.$('<img>').attr('src',$('#mycanvas')[0].toDataURL('image/png')).appendTo($('#element-to-write-to').empty());
ровно одна строка.Вы можете использовать jspdf для захвата холста в изображение или PDF, например:
Больше информации: https://github.com/MrRio/jsPDF
источник
Это другой способ, без строк, хотя я не знаю, быстрее это или нет. Вместо toDataURL (как предлагают все вопросы). В моем случае я хочу предотвратить dataUrl / base64, так как мне нужен буфер массива или представление. Таким образом, другой метод в HTMLCanvasElement есть
toBlob
. (Функция TypeScript):Еще одним преимуществом больших двоичных объектов является то, что вы можете создавать ObjectUrls для представления данных в виде файлов, аналогично элементу «files» в HTMLInputFile. Больше информации:
https://developer.mozilla.org/es/docs/Web/API/HTMLCanvasElement/toBlob
источник
В некоторых версиях Chrome вы можете:
ctx.drawImage(image1, 0, 0, w, h);
источник