我正在尝试使用数据 URI 在画布元素内绘制图像。我正在使用 Django 并将包含照片的 base64 编码的变量传递给模板。过去,我是这样使用的:
<img src="data:image/jpg;base64, {{ photo_data }}">
这工作正常。我现在想用这个替换它:
<canvas id="canvas"></canvas>
并使用 javascript 在画布中绘制图像。我尝试了这个答案的代码:
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 }}"
这给了我最后一行的javascript错误“SyntaxError:未终止的字符串文字”。我读到这个错误通常是由于换行符而发生的。在检查页面源时,它看起来像是有换行符:
所以然后我尝试删除换行符:
function removeBreaks(data){
return data.replace(/(\r\n|\n|\r)/gm, "");
}
var photo_data = removeBreaks({{ photo_data }});
现在,当我调用 removeBreaks 时,我遇到了一个新错误。“语法错误:标识符在数字文字之后立即开始”。
var photo_data = removeBreaks(/9j/4AAQSkZ...
----------------------------------^
我需要做某种逃避,如果是,我该怎么做?
更新
我尝试了评论和答案中的所有建议。到目前为止,最接近工作的事情正在做
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,图像根本不会显示"
,当我删除它们时,只显示图像的前三分之一。我尝试调整画布元素的大小,这似乎不是问题。
更新#2
原来画布大小是问题所在。画布元素的宽度和高度需要与图像的宽度和高度一样大或更大,这是我在创建Image
对象时没有设置的。接受的答案和 json.dumps (带有"
警告)都可以解决原始问题。