同步画布绘制/读取
Syncing canvas drawing / reading
所以我有一个小的静态类用于图像转换:
// static class ImageFactory
var ImageFactory = (function () {
var ImageFactory = {};
ImageFactory.flip = function (image) {
return invert(image, false, true);
};
ImageFactory.mirror = function (image) {
return invert(image, true, false);
};
// private
function invert(image, isMirror, isFlip) {
var canvas = document.createElement("canvas");
canvas.width = image.width;
canvas.height = image.height;
var context = canvas.getContext("2d");
context.translate(isMirror ? canvas.width : 0, isFlip ? canvas.height : 0);
context.scale(isMirror ? -1 : 1, isFlip ? - 1 : 1);
context.drawImage(image, 0, 0);
return canvas;
}
return ImageFactory;
})();
问题是:有时它会产生"空白"(完全透明)的图像,而不是翻转和镜像,在Chrome和Firefox中都是如此。我怀疑这与有时不能及时完成的异步操作有关。根据一些文献,画布绘图应该被浏览器同步处理,但这个问题告诉我另一种方式。
无论如何,是否有一种安全的方法来绘制到次要画布,然后使用该画布作为图像绘制在主画布上?
这段代码应该确保在所有输入图像准备好之前没有调用ImageFactory方法:
function load() {
for (var i = 0; i < images.length; ++i) {
var image = images[i];
if (!image.complete) {
var timeout = setTimeout(onTimeout, LOADING_TIMEOUT);
return;
}
}
scene = sceneFactory();
loop();
function onTimeout() {
load();
}
}
其中images
只是一个包含DOM中所有图像的数组。只有在loop()
被调用之后,我才有一些对ImageFactory方法的调用。
我不确定究竟是什么可能导致这个问题,但我猜这是由于图像没有准备好,当函数被调用。
加载完成后,尝试调用镜像函数。
使用image onload回调来检查图像是否已经完成加载并准备好使用。
你也可以尝试在一秒钟后再次绘制画布,只是为了确保它被正确绘制。
相关文章:
- 从桌面读取python文件时高亮显示代码
- Javascript-如何读取json文件中的列并将其保存在Javascript数组中
- 使用Dnamics CRM 2011中的JavaScript读取子网格的所有记录,而不考虑活动页面
- D3在一个调用中绘制不同的SVG形状,没有可见性
- 节点Js:How to catch a“;没有这样的文件或目录“;读取线模块出错
- TypeError:无法读取属性'推'未定义的JavaScript
- 同样,同样的错误'ahorcado.js:26未捕获类型错误:无法读取属性'beginPath'
- 未捕获的TypeError无法读取未定义的属性socialsharing
- 如何在读取XLS/XLSX本地文件时,使用IE的javascript代码启用未标记为安全的ActiveX控件
- 有没有一个javascript图形绘制库可以进行气球树布局
- 字符串在将其传递给另一个活动Android JavaScript时读取Null
- 在画布上绘制时,“未捕获的类型错误:无法读取未定义的属性'getContext'”
- 动态读取属性文件并在 javascript 中绘制文本框
- Highcharts不显示数据,而是在从CSV文件读取时绘制图表
- 通过读取 X,Y 坐标绘制正方形
- Django不能读取CSV文件来绘制javascript和HTML模板中的highchart
- 读取JSON并使用Angular JS绘制它
- 如何使用Chart.js读取和绘制json
- 同步画布绘制/读取
- 无法读取属性'undefined"当使用AngularJS在谷歌地图上绘制标记时