javascript - 如何使用多文件上传控件合并多个上传的图像?

标签 javascript angularjs html5-canvas

我正在尝试合并多个图像,同时从桌面检索图像。它取自 "How to create an image generator for combining multiple images?" .如果上传单个图像,它工作正常,但在多个图像的情况下不工作。

这是我的 HTML 代码

<input id="file-input" type="file" name="images[]" multiple maxlength="5" ngf-select="UploadFiles($files)" accept=".png,.jpg,.jpeg,.gif" />
<canvas id="canvas"></canvas>

这是javascript代码

    var canvas = document.getElementById('canvas');
        var ctx = canvas.getContext('2d');
    
        var lastImage;
        var lastHeight = 0;
        var lastWidth = 0;
        var imagesLoaded = 0;
    
        function max(a, b) {
            if (a > b)
                return a;
            return b;
        }
    
        function addToCanvas(img) {
            canvas.height = max(lastHeight, img.width);
            canvas.width = lastWidth + img.height;
    
            ctx.clearRect(0, 0, canvas.width, canvas.height);
            if (lastImage) {
                ctx.drawImage(lastImage, 0, canvas.height - lastImage.height);
            }
    
            ctx.rotate(270 * Math.PI / 180); // rotate the canvas to the specified degrees
            ctx.drawImage(img, -canvas.height, lastWidth);
    
            lastImage = new Image();
            lastImage.src = canvas.toDataURL();
            lastWidth += img.height;
            lastHeight = canvas.height;
            imagesLoaded += 1;
        }
    
     $scope.UploadFiles = function (files) {
            $scope.SelectedFiles = files;
            cnt = files.length;
    
            console.log($scope.SelectedFiles);
    
            for (i = 0; i < $scope.SelectedFiles.length; i++) {
                console.log(files[i]);
                var reader = new FileReader();
    
                reader.onload = function (event) {
                    var img = new Image();
    
                    img.onload = function () {
                        addToCanvas(img);
                    }
    
                    img.src = reader.result;
                }
    
    
                reader.readAsDataURL(files[i]);
            }
        };

当我从文件夹中选择图像时,控制台的调试器在 img.onload 事件处停止,我试图在该事件中循环执行操作。

最佳答案

For 循环迭代不适用于图像加载函数..

files.map((file) => {
 var reader = new FileReader();
 reader.onload = (event) => {
 var img = new Image();
 img.onload = () => 
{
 addToCanvas(img);
}
img.src = reader.result;
 }
 reader.readAsDataURL(file);
 }
)

关于javascript - 如何使用多文件上传控件合并多个上传的图像?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58336634/

相关文章:

javascript - Cordova Console.log 不打印 $http 响应

javascript - anchor 元素的路径名在 Rhino 中使用 env.js 返回未定义

javascript - 为什么 Canvas Angular 落的球速度较低?

javascript - 变量内的 if 语句

javascript - 如何使用 WebdriverIO 同时按下两个键?

javascript - 将日期和时间转换为单一格式字符串的 Angular 过滤器

javascript - 如何让矩形平滑地变成圆形?

Javascript 替换 - 替换的动态值

javascript - 无法访问 $watch 内的范围变量

save - 我如何让 fabric.js 保存 Canvas 中每个对象的状态/位置并恢复以供将来编辑?