Помощь с 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, время: 10:22. |