Я работаю над проектом, который создает изображение на холсте HTML, а затем предлагает загрузить изображение в формате PNG.Загрузить сгенерированный холст с blobs
Программа должна быть клиентской (javascript).
я могу преобразовать холст изображение с помощью
var canvas=document.getElementById('canvas');
var img = canvas.toDataURL("image/png;base64");
И код, который должен загрузить изображение является:
var container = document.querySelector('#container2');
//container2 is a div in HTML
var output = container.querySelector('output');
//output is inside container2
window.URL = window.webkitURL || window.URL;
var prevLink = output.querySelector('a');
if (prevLink) {
window.URL.revokeObjectURL(prevLink.href);
output.innerHTML = '';}
//removes the download link if already there
var bb = new Blob([img], {data: "image/png;base64"});
//creates new blob from the img variable
var a = document.createElement('a');
a.download = 'test' + '.png';
//file name
a.href = window.URL.createObjectURL(bb);
//create URL from blob
a.textContent = 'Click here for download';
a.dataset.downloadurl = ["image/png;base64", a.download, a.href].join(':');
output.appendChild(a);
Это отлично работает, если blobvariable является строка текста вместо переменной «img». Вместо изображения я получаю поврежденный файл .png, который, открытый в блокноте, дает данные: image/png; base64, iVBORw0KGgoAAAANSUhEU ... (длинная строка букв base64), которая является правильной строкой, но apparantly not good для изображений PNG. Но если я пишу
document.write('<img src="'+img+'"/>');
Изображение открывается правильно на новой вкладке.
Как я могу сделать загруженное изображение неповрежденным?
(это кажется невозможным, чтобы загрузить данные, сгенерированные Canvas2image)
Я попытался с помощью .atob(), чтобы декодировать строку. Загрузка этого файла дала мне поврежденный файл, но его открытие в блокноте показало сходство с работающими файлами PNG. Я сравнил исходное изображение с кодом декодированного изображения, и кажется, что некоторые части отсутствуют (в Notepad ++ это отображается как [NUL], [STX] [FF] и т. Д. Любая идея о том, что не так? – user2262765
yep, read my редактировать – andrjas