Я пытаюсь нарисовать изображение внутри элемента canvas, используя URI данных. Я использую Django и передаю в шаблон переменную, содержащую кодировку base64 фотографии. В прошлом я использовал это так:Данные URI, вызывающие ошибки синтаксиса в Javascript
<img src="data:image/jpg;base64, {{ photo_data }}">
Это прекрасно работает. Теперь я хочу это заменить:
<canvas id="canvas"></canvas>
и использовать javascript для создания изображения на холсте. Я попробовал код из this answer:
var canvas = $('#canvas');
var ctx = canvas.getContext('2d');
var img = new Image;
$(img).load(function(){
ctx.drawImage(img, 0, 0);
});
img.src = "data:image/jpg;base64, {{ photo_data }}"
Это дает мне ошибку яваскрипта «SyntaxError: незавершенная строка» на последней строке. Я читал, что эта ошибка обычно происходит из-за разрывов строк. После проверки исходного кода страницы это выглядит как есть разрывы строк там:
Итак, я попытался удалить разрывы строк:
function removeBreaks(data){
return data.replace(/(\r\n|\n|\r)/gm, "");
}
var photo_data = removeBreaks({{ photo_data }});
Теперь я получаю новую ошибку, когда я звоню removeBreaks. «SyntaxError: идентификатор начинается сразу после числового литерала».
var photo_data = removeBreaks(/9j/4AAQSkZ...
----------------------------------^
Есть ли какое-то ускорение, которое мне нужно сделать, и если да, то как бы я это сделал?
Update
Я попробовал все предложения от комментариев и ответ. До сих пор дело, что ближе всего к обработке делает
photo_data = json.dumps(<base64 encoded image file>)
на стороне Django и
var photo_data = "{{ photo_data }}".replace(/"/g,"");
img.src = "data:image/jpg;base64, " + photo_data;
на стороне Javascript. Изображение не отображается вообще, если я не заменяю "
s, и когда я удаляю их, отображается только верхняя треть изображения. Я попытался изменить размер элемента canvas, что, похоже, не является проблемой.
Update # 2
Оказывается размер холста был вопрос. Ширина и высота элемента холста должны быть такими же большими или большими, как ширина и высота изображения, которые я не устанавливал, когда я создал объект Image
. Как принятый ответ, так и json.dumps (с предостережением "
) работают для решения исходной проблемы.
Попробуйте 'removeBreaks (" {{photo_data}} ");' – Matt
Я сделал, что снова возвращает ошибку «unterminated string literal». – snorthway
Вам придется преобразовать этот блок текста так, чтобы реальные новые строки были заменены на '\ n' - обратную косую черту и« n », так как JavaScript ожидает, что разрывы строк будут закодированы в строках. Вы должны сделать это на стороне Django, а не на стороне JavaScript. – Pointy