&引用;“加载图像”;Javascript在上传前调整图像大小

&引用;“加载图像”;Javascript在上传前调整图像大小,javascript,performance,canvas,recursion,loadimage,Javascript,Performance,Canvas,Recursion,Loadimage,我正在开发一个图像上传的小功能。此图像上载将调整客户端上选定图片的大小,并上载调整大小的图像 这是可行的,但浏览器将在“调整功能大小”之间挂起很多。 这是我的代码: function manageImage(file) { if (!file) return; var mime = file.type; var src = URL.createObjectURL(file); loadImage.parseMetaData

我正在开发一个图像上传的小功能。此图像上载将调整客户端上选定图片的大小,并上载调整大小的图像

这是可行的,但浏览器将在“调整功能大小”之间挂起很多。 这是我的代码:

    function manageImage(file) {
        if (!file) return;
        var mime = file.type;
        var src = URL.createObjectURL(file);

        loadImage.parseMetaData(file, function (data) {
            var options = { maxWidth: 1920, maxHeight: 1920, canvas: true };
            if (data.exif) {
                options.orientation = data.exif.get('Orientation');
            }
            loadImage(file,
            function (img, test) {

                    loaded++;

                    var formData = new FormData();
                    formData.append("image", dataURI);

                    $.ajax({
                        url: "/URL",
                        data: formData,
                        cache: false,
                        contentType: false,
                        processData: false,
                        async: false,
                        type: "POST",
                        success: function (resp) {


                        }
                    }).error(function () {
                    }).done(function () {
                        if (loaded < checkedFiles.length) {
                                manageImage(files[loaded]);
                        } else {
                            //FINISHED
                        }
                    });

            },
            options);
        });
    }
    manageImage(files[0]);
函数manageImage(文件){
如果(!文件)返回;
var mime=file.type;
var src=URL.createObjectURL(文件);
解析元数据(文件、函数(数据){
var options={maxWidth:1920,maxHeight:1920,canvas:true};
if(data.exif){
options.orientation=data.exif.get('orientation');
}
加载图像(文件,
功能(img、测试){
加载++;
var formData=new formData();
追加(“图像”,dataURI);
$.ajax({
url:“/url”,
数据:formData,
cache:false,
contentType:false,
processData:false,
async:false,
类型:“POST”,
成功:功能(resp){
}
}).错误(函数(){
}).done(函数(){
如果(已加载
这个函数是递归的,因为我在迭代中遇到了一些问题(浏览器挂起、内存和cpu使用)

此外,我正在使用此库获取EXIF数据和移动电话上的正确方向:

有一个或两个选定的图片(如7MB)它的作品完美,但我想上传大约50张图片


如果有人能给我一个线索就好了

我读对了吗。您希望从移动设备处理并向上加载50个7MB图像。如果是这样的话,那么你就必须接受这样一个事实,即手机无法及时粉碎和发送那么多数据。@Blindman67我的电脑上的数据仍然落后;)即使是个人电脑也会有困难。如果是7MB JPG,则在1200万像素范围内,将扩展到每幅图像12*4(RGBA)48MB以上。如果您正在使用Javascript进行大小缩减,那么这将花费很长时间。考虑使用GPU来减少图像的大小:<代码> CTX.DRAWWMAGE(图像,0, 0,Image .Image,Image .Image,0, 0,Read Dead Wrand,Read Dead Lead)< /Cord>,这将极大地提高吞吐量。谢谢@盲人67。你是对的,但是我正在用ctx.drawImage做这个,它仍然非常慢。。。也许还有另一种提高性能的方法。你正处于技术的极限,你所能做的就是得到更快的设备。尽管在开始加载下一个图像时,仔细检查代码以确保没有保留上一个图像可能会有好处。您没有提供足够的代码来查看,但由于您是以递归方式执行此操作,因此可能会保留对以前图像的引用,从而造成内存瓶颈。如果不使用递归,请尝试
setTimeout(函数(manageImage(files[loaded])),0)
它可能会稍微提高性能。