ChatGPT解决这个技术问题 Extra ChatGPT

将图像从数据 URL 绘制到画布

如何在 Canvas 中打开图像?这是编码的

我正在使用

var strDataURI = oCanvas.toDataURL(); 

输出是编码的 base 64 图像。如何在画布上绘制此图像?

我想使用 strDataURI 并创建图像?它是否可行?
如果不是,那么将图像加载到画布上的解决方案可能是什么?

在这种情况下它不起作用:: jsfiddle.net/V92Gn/5376

C
Community

给定数据 URL,您可以通过将图像的 src 设置为数据 URL 来创建图像(在页面上或纯粹在 JS 中)。例如:

var img = new Image;
img.src = strDataURI;

HTML5 Canvas Context 的 drawImage() method 允许您将图像(或画布或视频)的全部或部分复制到画布上。

你可以像这样使用它:

var myCanvas = document.getElementById('my_canvas_id');
var ctx = myCanvas.getContext('2d');
var img = new Image;
img.onload = function(){
  ctx.drawImage(img,0,0); // Or at whatever offset you like
};
img.src = strDataURI;

编辑:我之前在此空间中建议,当涉及数据 URI 时,可能不需要使用 onload 处理程序。根据 this question 的实验测试,这样做是不安全的。上述顺序(创建图像,设置 onload 以使用新图像,然后然后设置 src)对于某些浏览器来说是必要的,以确保使用结果。


使用 onload 处理程序绝对是一个好主意。加载图像可能需要一段时间,因此最好安全播放。 :)
@bebraw 让我们确定一下:stackoverflow.com/questions/4776670/… :)
@Phrogz 它给了我一个错误: var ctx = myCanvas.getContext('2d');只需复制/粘贴您的代码即可进行测试
@jepser 您的页面上是否有具有该 ID 的 canvas 元素?您是否确保 myCanvas 不为空?如果您仍有问题,请发布您自己的问题,或访问 JavaScript chat channel
@DavidMurdoch 很棒的信息。您是否有可以链接到的 Chromium 错误,以便用户知道上述陈述何时不再正确?
R
Raphael C
function drawDataURIOnCanvas(strDataURI, canvas) {
    "use strict";
    var img = new window.Image();
    img.addEventListener("load", function () {
        canvas.getContext("2d").drawImage(img, 0, 0);
    });
    img.setAttribute("src", strDataURI);
}

j
joe

只是添加到其他答案:如果您不喜欢 onload 回调方法,您可以像这样“承诺”它:

let url = "data:image/gif;base64,R0lGODl...";
let img = new Image();
await new Promise(r => img.onload=r, img.src=url);
// now do something with img

啊谢谢你!我想将 PNG 放在函数内的画布上,但它在 img.onload 函数运行之前返回。使用 await 解决了这个问题。
佚名

也许这个小提琴会有所帮助ThumbGen - jsFiddle它使用 File API 和 Canvas 来动态生成图像的缩略图。

(function (doc) {
    var oError = null;
    var oFileIn = doc.getElementById('fileIn');
    var oFileReader = new FileReader();
    var oImage = new Image();
    oFileIn.addEventListener('change', function () {
        var oFile = this.files[0];
        var oLogInfo = doc.getElementById('logInfo');
        var rFltr = /^(?:image\/bmp|image\/cis\-cod|image\/gif|image\/ief|image\/jpeg|image\/jpeg|image\/jpeg|image\/pipeg|image\/png|image\/svg\+xml|image\/tiff|image\/x\-cmu\-raster|image\/x\-cmx|image\/x\-icon|image\/x\-portable\-anymap|image\/x\-portable\-bitmap|image\/x\-portable\-graymap|image\/x\-portable\-pixmap|image\/x\-rgb|image\/x\-xbitmap|image\/x\-xpixmap|image\/x\-xwindowdump)$/i
        try {
            if (rFltr.test(oFile.type)) {
                oFileReader.readAsDataURL(oFile);
                oLogInfo.setAttribute('class', 'message info');
                throw 'Preview for ' + oFile.name;
            } else {
                oLogInfo.setAttribute('class', 'message error');
                throw oFile.name + ' is not a valid image';
            }
        } catch (err) {
            if (oError) {
                oLogInfo.removeChild(oError);
                oError = null;
                $('#logInfo').fadeOut();
                $('#imgThumb').fadeOut();
            }
            oError = doc.createTextNode(err);
            oLogInfo.appendChild(oError);
            $('#logInfo').fadeIn();
        }
    }, false);
    oFileReader.addEventListener('load', function (e) {
        oImage.src = e.target.result;
    }, false);
    oImage.addEventListener('load', function () {
        if (oCanvas) {
            oCanvas = null;
            oContext = null;
            $('#imgThumb').fadeOut();
        }
        var oCanvas = doc.getElementById('imgThumb');
        var oContext = oCanvas.getContext('2d');
        var nWidth = (this.width > 500) ? this.width / 4 : this.width;
        var nHeight = (this.height > 500) ? this.height / 4 : this.height;
        oCanvas.setAttribute('width', nWidth);
        oCanvas.setAttribute('height', nHeight);
        oContext.drawImage(this, 0, 0, nWidth, nHeight);
        $('#imgThumb').fadeIn();
    }, false);
})(document);

g
gabrielrincon

混合我做的答案。

function drawDataURIOnCanvas(strDataURI, canvas) {
   var img = new window.Image();
   img.addEventListener("load", function () {
     canvas.getContext("2d").clearRect(0, 0, canvas.width, canvas.height);
     canvas.width = img.width;
     canvas.height = img.height;
     canvas.getContext("2d").drawImage(img, 0, 0, img.width, img.height);
   });

   img.setAttribute("src", strDataURI);
}

H
Hitesh Sahu

您可能想在设置新图像之前清除旧图像。

您还需要更新新图像的画布大小。

这就是我在项目中的做法:

    // on image load update Canvas Image 
    this.image.onload = () => {

      // Clear Old Image and Reset Bounds
      canvasContext.clearRect(0, 0, this.canvas.width, this.canvas.height);
      this.canvas.height = this.image.height;
      this.canvas.width = this.image.width;

      // Redraw Image
      canvasContext.drawImage(
        this.image,
        0,
        0,
        this.image.width,
        this.image.height
      );
    };

u
user475434

在 javascript 中,使用 jquery 进行画布 id 选择:

 var Canvas2 = $("#canvas2")[0];
        var Context2 = Canvas2.getContext("2d");
        var image = new Image();
        image.src = "images/eye.jpg";
        Context2.drawImage(image, 0, 0);

html5:

<canvas id="canvas2"></canvas>

这不能回答与 dataURL 相关的 OP 问题。
为什么要使用 jQuery 来选择画布?输入 document.getElementById() 工作量太大了吗?
此代码有效,但与问题无关