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( ... );