HTML5画布,保存JPEG blob并从blob恢复到画布

22 浏览
0 Comments

HTML5画布,保存JPEG blob并从blob恢复到画布

我有一个包含图像的画布#mycanvas。我想将该图像创建为一个blob对象,最好是jpeg格式。这是我创建blob对象的方法:

document.getElementById('mycanvas').toDataURL("image/jpeg").replace(/^data:image\/(png|jpeg);base64,/, "")

如何通过这个blob对象重新创建图像,并再次显示在#mycanvas中?

0
0 Comments

问题的原因是:在HTML5的canvas中,当使用takePhoto()方法从MediaStream中获取照片数据时,返回的是一个JPEG格式的blob对象。然而,canvas的drawImage()方法只能直接接受Image对象或者ImageBitmap对象作为参数,无法直接接受blob对象。

解决方法是:首先,使用createImageBitmap()方法将blob对象转换为ImageBitmap对象。然后,通过获取canvas元素和调用drawCanvas()函数,将ImageBitmap对象绘制到canvas上。drawCanvas()函数中,首先设置canvas的宽度和高度,然后计算绘制比例、位置,最后通过canvas的getContext('2d')方法进行清除画布,然后使用drawImage()方法将ImageBitmap对象绘制到canvas上。

通过以上的解决方法,就可以实现从blob对象恢复到canvas的操作。

0
0 Comments

HTML5 canvas提供了一个强大的绘图功能,可以通过JavaScript代码来绘制图形、图像等。在某些情况下,我们可能需要将canvas上的图像保存为JPEG格式的文件,并在需要的时候从这个文件中恢复到canvas上。

然而,在过去的一段时间里,有一个问题困扰着开发者们,即无法直接将JPEG格式的文件保存为blob对象,并且在需要的时候将其恢复到canvas上。Anton的解决方法在最新的版本中已经不再适用,需要使用新的语法来解决这个问题。

解决方法如下所示:

function blob2canvas(canvas, blob){
    var img = new window.Image();
    img.addEventListener("load", function () {
        canvas.getContext("2d").drawImage(img, 0, 0);
    });
    img.setAttribute("src", blob);
}

这段代码定义了一个名为`blob2canvas`的函数,该函数接受两个参数:`canvas`和`blob`。在函数内部,我们创建了一个新的`Image`对象,并为其添加了一个`load`事件监听器。当图像加载完成后,我们通过`canvas.getContext("2d").drawImage`方法将图像绘制到canvas上。

最后,我们通过`img.setAttribute("src", blob)`将blob对象设置为图像的来源,从而实现从blob对象到canvas的恢复。

通过这种方法,我们可以保存JPEG格式的图像为blob对象,并在需要的时候将其恢复到canvas上,从而实现了HTML5 canvas的保存和恢复功能。

0
0 Comments

问题的原因是在HTML5的canvas中,我们可以使用toDataURL方法将canvas中的内容转换为一个base64编码的字符串。然而,当我们想要将canvas中的内容保存为一个blob对象时,toDataURL方法并不能直接实现。

解决方法是使用toBlob方法,该方法可以将canvas中的内容转换为一个blob对象。然而,在最新的浏览器版本中,toBlob方法已经被废弃了,取而代之的是使用URL.createObjectURL方法来创建一个URL对象,然后将该URL对象赋值给img的src属性,从而实现将blob对象转换为canvas中的内容。

下面是解决问题的代码:

function blob2canvas(canvas, blob) {
    var img = new Image();
    var ctx = canvas.getContext('2d');
    img.onload = function () {
        ctx.drawImage(img, 0, 0);
    }
    img.src = URL.createObjectURL(blob);
}

通过调用这个函数,我们可以将一个blob对象的内容绘制到指定的canvas中。

需要注意的是,为了能够正确地使用URL.createObjectURL方法,我们需要在使用完URL对象后及时调用URL.revokeObjectURL方法来释放资源,避免内存泄漏。

0