Помощь с Base64!!!
Как разшифровать base64 строку?
Вот что есть: var canvas = document.getElementById('my_canvas'); var context = canvas.getContext('2d'); var pic = new Image(); pic.onload = function(){ canvas.width = pic.width; canvas.height = pic.height; context.drawImage(pic, 0, 0, pic.width, pic.height); context.fillStyle = "black"; context.font = 'bold 30px sans-serif'; context.fillText("Autor Famyly", 290, 235); }; pic.src = '../images/account_info/certificates/item_2.jpg'; var dataURL = canvas.toDataURL("image/png"); //это base64 как его перевести в бинарник? function save_canvas () { var a = document.createElement('a'); a.href = dataURL; a.download = 'Certificate'; a.click(); }; После нужно будет полученый бинарник закинуть в a.href, что-бы пользователь мог скачать CANVAS. Методы btoa, atob не работают! Нужна помощь! |
Вроде рабоатет.
https://jsfiddle.net/fearmearwrk/0Lxbgtk1/2/ Поменял pic.src на 'https://jsfiddle.net/img/logo.png' и вызвал save_canvas(); |
Цитата:
|
Проблема в том, что pic.onload это асинхронный код, а все ниже написано синхоронно. Соответственно нужно завернуть в callback, а лучше Promise.
var canvas = document.createElement('canvas'); var context = canvas.getContext('2d'); function loadImage(src, cb){ var pic = new Image(); pic.onload = function(){ canvas.width = pic.width; canvas.height = pic.height; drawImage(pic, cb); } pic.crossOrigin = 'anonymous'; pic.src = src; } function drawImage(pic, cb){ context.drawImage(pic, 0, 0, pic.width, pic.height); context.fillStyle = "black"; context.font = 'bold 30px sans-serif'; context.fillText("Autor Famyly", 290, 235); cb(); } function saveImage(dataURL) { var a = document.createElement('a'); a.href = dataURL; a.download = 'Certificate'; a.click(); }; loadImage('http://i.imgur.com/fHyEMsl.jpg', function(){ saveImage(canvas.toDataURL("image/png")); }); |
fearmear.wrk,
в Google Chrome сработало |
Пример с Promise. JSFiddle
var canvas = document.createElement('canvas'); var context = canvas.getContext('2d'); function loadImage(src){ return new Promise(function(resolve){ var pic = new Image(); pic.onload = function(){ canvas.width = pic.width; canvas.height = pic.height; resolve(pic); } pic.crossOrigin = 'anonymous'; pic.src = src; }); } function drawImage(pic){ context.drawImage(pic, 0, 0, pic.width, pic.height); context.fillStyle = "black"; context.font = 'bold 30px sans-serif'; context.fillText("Autor Famyly", 290, 235); return canvas.toDataURL("image/png"); } function saveImage(dataURL) { var a = document.createElement('a'); a.href = dataURL; a.download = 'Certificate'; a.click(); }; loadImage('http://i.imgur.com/fHyEMsl.jpg').then(drawImage).then(saveImage); |
Спасибо, огромное! Но мне нужно что-бы окно "сохранения" вылезало по нажатию на кнопку с id="saver_btn". Что-то никак не могу настроить. Я использую 1 способ с callback'ом
|
И почему когда я вставляю свой путь к картинке, мне выдает ошибку? Я так понимаю дело в crossОrigin'е? Вот путь к моей картинке ../images/account_info/certificates/item_1.jpg
|
Цитата:
|
Ошибка вылазит!
your_cerificate.html:89 Uncaught DOMException: Failed to execute 'toDataURL' on 'HTMLCanvasElement': Tainted canvases may not be exported. at file:///D:/Courselogy/tabs/your_cerificate.html:89:26 at drawImage (file:///D:/Courselogy/tabs/your_cerificate.html:78:7) at Image.pic.onload (file:///D:/Courselogy/tabs/your_cerificate.html:68:9) |
Часовой пояс GMT +3, время: 00:17. |