[英]How to wait for the multiple images to load in the canvas and convert to base64?
我正在尝试在HTML5中获得画布的base64版本。
目前,我从画布上获得的base64图像为空白。
我发现类似的问题,例如这个问题:
但是,我的问题是,因为我要在画布中添加2张图像,所以我无法使用这些答案中提供的示例,因为它们中的大多数都使用单个图像。
我知道我必须等到画布图像正确加载后才能尝试获取base64图像。 但是我不知道该怎么办。
这是我的代码:
var canvas = document.getElementById('myCanvas'); var context = canvas.getContext('2d'); context.canvas.width = 1000; context.canvas.height = 1000; var imageObj1 = new Image(); imageObj1.src = "http://www.offthegridnews.com/wp-content/uploads/2017/01/selfie-psuDOTedu.jpg"; imageObj1.onload = function() { context.drawImage(imageObj1, 0, 180, canvas.width, canvas.height); }; var imageObj2 = new Image(); imageObj2.src = "http://www.publicdomainpictures.net/pictures/150000/velka/banner-header-tapete-145002399028x.jpg" imageObj2.onload = function() { context.drawImage(imageObj2, 0, 0, canvas.width, 180); }; // get png data url //var pngUrl = canvas.toDataURL(); var pngUrl = canvas.toDataURL('image/png'); // get jpeg data url var jpegUrl = canvas.toDataURL('image/jpeg'); $('#base').val(pngUrl);
<div class="contents" style="overflow-x:hidden; overflow-y:scroll;"> <div style="width:100%; height:90%;"> <canvas id="myCanvas" class="snap" style="width:100%; height:100%;" onclick="takephoto()"></canvas> </div> </div> <p> This is the base64 image </p> <textarea id="base"> </textarea>
这是可行的FIDDLE:
https://jsfiddle.net/3p3e6Ldu/1/
有人可以在这个问题上提出建议吗?
提前致谢。
编辑:
如下面的注释中所建议,我尝试使用一个计数器,当计数器达到特定数字时,我将画布转换为base64。
像这样: https : //jsfiddle.net/3p3e6Ldu/4/
在您的两个示例(一个来自问题的示例和一个来自注释的示例)中,命令的顺序并没有真正尊重手头任务的异步性质。 在后面的示例中,应将if( count == 2 )
块放入onload
回调中,以使其正常工作。
但是,即使那样,您仍然会遇到下一个问题:您正在从不同的域加载图像。 您仍然可以绘制它们(在画布中或使用<img>
标记),但是您不能直接访问它们的内容。 即使使用<canvas>
元素也不走弯路。
我将代码更改为如果图像托管在同一域上则可以运行。 我还使用了一个函数来加载图像并承诺处理回调。 使用回调和计数变量的直接方法对我来说似乎容易出错。 如果您查看相应的小提琴 ,您将注意到显示的SecurityError
。 这是我提到的相同原产地政策的上述问题的结果。
我以前在类似方向上的问题是关于如何检测,如果我在添加一些图像后仍能读取<canvas>
的内容。
const canvas = document.getElementById('myCanvas');
const context = canvas.getContext('2d');
context.canvas.width = 1000;
context.canvas.height = 1000;
// function to retrieve an image
function loadImage(url) {
return new Promise((fulfill, reject) => {
let imageObj = new Image();
imageObj.onload = () => fulfill(imageObj);
imageObj.src = url;
});
}
// get images
Promise.all([
loadImage("http://www.offthegridnews.com/wp-content/uploads/2017/01/selfie-psuDOTedu.jpg"),
loadImage("http://www.publicdomainpictures.net/pictures/150000/velka/banner-header-tapete-145002399028x.jpg"),
])
.then((images) => {
// draw images to canvas
context.drawImage(images[0], 0, 180, canvas.width, canvas.height);
context.drawImage(images[1], 0, 0, canvas.width, 180);
// export to png/jpg
const pngUrl = canvas.toDataURL('image/png');
const jpegUrl = canvas.toDataURL('image/jpeg');
// show in textarea
$('#base').val(pngUrl);
})
.catch( (e) => alert(e) );
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.