Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 哪种方法可以尽可能直接地从DataTour图像字符串创建画布模式?_Javascript_Performance_Canvas_Html5 Canvas_Race Condition - Fatal编程技术网

Javascript 哪种方法可以尽可能直接地从DataTour图像字符串创建画布模式?

Javascript 哪种方法可以尽可能直接地从DataTour图像字符串创建画布模式?,javascript,performance,canvas,html5-canvas,race-condition,Javascript,Performance,Canvas,Html5 Canvas,Race Condition,我用的是一张我以前用过的照片 var patternImageAsDataURL= canvasObject.toDataURL('image/png'); 在以后的阶段中,我想制作一个画布模式对象。下面的代码不起作用-我假设图像在转到最后一行时没有加载,在createPattern函数中需要它 var img = document.createElement('img'); img.src = patternImageAsDataURL; // canvasctx was created s

我用的是一张我以前用过的照片

var patternImageAsDataURL= canvasObject.toDataURL('image/png');
在以后的阶段中,我想制作一个画布模式对象。下面的代码不起作用-我假设图像在转到最后一行时没有加载,在createPattern函数中需要它

var img = document.createElement('img');
img.src = patternImageAsDataURL;
// canvasctx was created somewhere else in the program
pattern = canvasctx.createPattern(img,'repeat');
我得到错误:
NS\u错误\u不可用:
在最后一行。(当使用console.log时,在最后两行之间的
img
的宽度和高度上,我看到当它不工作时,尺寸是
0

当稍后使用相同的dataURL执行相同的操作时,它确实起作用。尽管图像(img)应该总是重新创建。(我之所以能看到这一点,唯一的原因是因为Firefox中进行了一些内部优化。但这不是本文的主题,除非有人知道答案。)那么,将它们打印到控制台时的宽度和高度是正确的

虽然我将很快编程一些模式处理服务,这将解决这个问题,但我的问题是一般性的,考虑到速度和简单性。(如果我使用一些代码来处理20到50个具有模式的对象,我更喜欢精益解决方案,而不是内存或时间节省功能。)

我是否可以更直接(更快)地将dataURL用于 创建模式函数? 以及: 我是否可以强制程序在
img.src=patternImageAsDataURL之后等待命令,直到加载图像,然后继续处理代码?(与XMLrequests的同步模式类似。)

(在当前程序流中,使用映像的onload事件是不可行的。)


这是在Firefox 32 Win 7上运行的。

创建模式的更快、更直接的方法

您可以使用第二个画布元素作为模式的源

这允许您完全跳过从源画布创建ImageURL和图像的中间步骤,以便更快地创建模式

var canvas=document.getElementById(“canvas”);
var ctx=canvas.getContext(“2d”);
var cw=画布宽度;
var ch=画布高度;
//制作一个临时画布作为图案的模板
var pc=document.createElement('canvas');
var px=pc.getContext('2d');
pc.width=4;
pc.高度=4;
px.fillStyle='palegreen';
px.fillRect(0,0,2,2);
px.fillRect(2,2,2,2);
//使用临时画布作为“createPattern”的图像源
var pattern=ctx.createPattern(pc,'repeat');
ctx.fillStyle=图案;
ctx.fillRect(50,50100,75);
ctx.strokeRect(50,50100,75)
body{背景色:象牙;}
#画布{边框:1px纯红;}
使用临时画布作为模式的源。

创建模式的更快、更直接的方法

您可以使用第二个画布元素作为模式的源

这允许您完全跳过从源画布创建ImageURL和图像的中间步骤,以便更快地创建模式

var canvas=document.getElementById(“canvas”);
var ctx=canvas.getContext(“2d”);
var cw=画布宽度;
var ch=画布高度;
//制作一个临时画布作为图案的模板
var pc=document.createElement('canvas');
var px=pc.getContext('2d');
pc.width=4;
pc.高度=4;
px.fillStyle='palegreen';
px.fillRect(0,0,2,2);
px.fillRect(2,2,2,2);
//使用临时画布作为“createPattern”的图像源
var pattern=ctx.createPattern(pc,'repeat');
ctx.fillStyle=图案;
ctx.fillRect(50,50100,75);
ctx.strokeRect(50,50100,75)
body{背景色:象牙;}
#画布{边框:1px纯红;}
使用临时画布作为模式的源。

创建模式的更快、更直接的方法

您可以使用第二个画布元素作为模式的源

这允许您完全跳过从源画布创建ImageURL和图像的中间步骤,以便更快地创建模式

var canvas=document.getElementById(“canvas”);
var ctx=canvas.getContext(“2d”);
var cw=画布宽度;
var ch=画布高度;
//制作一个临时画布作为图案的模板
var pc=document.createElement('canvas');
var px=pc.getContext('2d');
pc.width=4;
pc.高度=4;
px.fillStyle='palegreen';
px.fillRect(0,0,2,2);
px.fillRect(2,2,2,2);
//使用临时画布作为“createPattern”的图像源
var pattern=ctx.createPattern(pc,'repeat');
ctx.fillStyle=图案;
ctx.fillRect(50,50100,75);
ctx.strokeRect(50,50100,75)
body{背景色:象牙;}
#画布{边框:1px纯红;}
使用临时画布作为模式的源。

创建模式的更快、更直接的方法

您可以使用第二个画布元素作为模式的源

这允许您完全跳过从源画布创建ImageURL和图像的中间步骤,以便更快地创建模式

var canvas=document.getElementById(“canvas”);
var ctx=canvas.getContext(“2d”);
var cw=画布宽度;
var ch=画布高度;
//制作一个临时画布作为图案的模板
var pc=document.createElement('canvas');
var px=pc.getContext('2d');
pc.width=4;
pc.高度=4;
px.fillStyle='palegreen';
px.fillRect(0,0,2,2);
px.fillRect(2,2,2,2);
//使用临时画布作为“createPattern”的图像源
var pattern=ctx.createPattern(pc,'repeat');
ctx.fillStyle=图案;
ctx.fillRect(50,50100,75);
ctx.strokeRect(50,50100,75)
body{背景色:象牙;}
#画布{边框:1px纯红;}
使用临时画布作为模式的源。
选项1-画布作为图像源 显而易见的是,使用画布本身作为模式的图像源

createPattern()
可以将图像、画布、上下文(尽管并非所有浏览器都允许)甚至视频作为视频

var img = document.createElement('img');
img.onload = function() {
    pattern = canvasctx.createPattern(this, 'repeat');
    // continue from here..
};
img.src = patternImageAsDataURL;
var patternImageAsBlob = canvas.toBlob(...);  //IE: msToBlob()
var patternAsBlob;

canvas.toBlob(function(blob) {
    patternAsBlob = blob;
    // continue from here
}
  var img = new Image(),
      url = URL.createObjectURL(patternAsBlob);

    img.onload = function() {
        URL.revokeObjectURL(url);  // clean up by removing the url object
        pattern = canvasctx.createPattern(this, 'repeat');
        // continue from here..
    };
    img.src = url;
 var domURL = self.URL || self.webkitURL || self;
 var url = domURL.createObjectURL( ... );