&引用;“加载图像”;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)
它可能会稍微提高性能。