【发布时间】:2015-04-27 12:00:15
【问题描述】:
我正在尝试了解如何利用 Angular 的 $q 库来显示基于画布绘图的图像,然后使用 .toDataURL() 进行转换;
基本上我想:
- 循环遍历图像 (
$scope.targetImages) - 在画布上绘制它们
- 使用
.toDataURL()将它们转换为图像并将其存储在($scope.outputImages)中; - 使用 ng-repeat 显示图像
问题是,函数 .toDataURL() 可能需要一些时间才能执行,从而导致第 4 步的调用延迟,因此没有显示任何内容。
我尝试了以下方法,但在所有图像转换之前仍然可以解决。
正如我现在所拥有的,当我第二次调用drawCanvas() 时,图像就会显示出来。
// 1
$scope.targetImages= {}
drawCanvas().then(function(data){
console.log("done: " + new Date())
console.log(data)
$scope.outputImages = data;
$scope.previewMode = false; // switch views, display canvas, remove preview
});
function drawCanvas() {
var defer = $q.defer();
var targetImages = {}
angular.forEach($scope.targetImages , function(imageObj, key) {
var canvas = document.getElementById("canvas");
var ctx = canvas.getContext("2d");
var img = new Image();
img.src = imageObj.nativeURL;
img.onload = start
// 2
function start() {
ctx.drawImage(img, 0, 0, img.width, img.height);
outputImages[key] = {
IID: key,
dataURL: canvas.toDataURL()
}
} // start
}); // for loop target images
defer.resolve(outputImages);
return defer.promise;
} // draw canvas
并显示为:
<img ng-show="!previewMode" ng-src="{{image.dataURL || ''}}" style="width: 100vw; max-width: 600px;">
【问题讨论】:
标签: javascript angularjs html canvas asynchronous