【发布时间】:2018-01-18 11:05:31
【问题描述】:
我正在尝试调整移动设备上的图片大小。 (使用 ionic 2 框架,基于 angular 2)。
我的最大文件大小为 5MB,有些设备捕获的图像比这更大。所以我目前正在尝试使用canvas.toDataURL() 调整图像大小,但这非常慢。 (应用程序在 15-20 秒内没有响应)。
我目前的调整大小功能如下:
private resize(outputFormat, sourceImgObj, quality) {
let mimeType = "image/jpeg";
let cvs = document.createElement('canvas');
cvs.width = sourceImgObj.naturalWidth;
cvs.height = sourceImgObj.naturalHeight;
let ctx = cvs.getContext("2d").drawImage(sourceImgObj, 0, 0);
let newImageData = cvs.toDataURL(mimeType, quality/100);
return newImageData;
}
当时哪个(我相信)基于j-i-c,如果不一样的话。
这个功能确实有效。在浏览器中它很不错但仍然很慢(Chrome)。但是当在设备上运行此功能时,例如选择 8 MB 的图像,应用程序基本上会崩溃。
有什么方法可以更快地压缩/调整图像大小?
其他信息
我通过使用cordova-plugin-camera 获取文件本身,这是指向用户设备上文件的直接链接。所以这不是 base64 图像(但如果需要,我确实能够轻松获得)。
【问题讨论】:
-
您是否尝试使用
cvs.toBlob而不是cvs.toDataURL?这可能会更好,因为 Blob 不需要新转换为(可能)base64 字符串。 -
查看nodeca.github.io/pica/demo 希望对您有所帮助!
-
您绝对需要保留图像的尺寸吗?我猜你的 8MB 图像相当大,如果它来自设备摄像头,压缩可能已经相当不错了。因此,当您在画布上绘制它时,您实际上是在生成一个新的原始图像(没有任何压缩),其像素数量与原始文件中的相同。这意味着您的画布本身将比原来的 8MB 内存大得多。当调用 toDataURL 时,它必须提取这些数据,处理它等等,消耗更多的内存。甚至不确定最后你会得到一个更轻的文件
-
那么总而言之,与其试图降低质量,你是否可以先尝试降低这些图像的尺寸?
-
没关系,只要保持纵横比不变
标签: javascript angular cordova ionic2