【发布时间】:2016-03-02 09:56:41
【问题描述】:
背景
我现在正在处理客户端选择图像。
我想对该图像执行两个操作,并输出 base64 编码的字符串。
- 如果图像尺寸的宽度或高度大于 1000,请调整其大小。
- 使用质量为 0.5 的 jpeg 压缩图像。
所以现在我将在主脚本中执行以下操作:
$(function() {
$('#upload').change(function() {
var URL = window.URL || window.webkitURL;
var imgURL = URL.createObjectURL(this.files[0]);
var img = new Image();
img.onload = function() {
var canvas = document.createElement('canvas');
var ctx = canvas.getContext('2d');
var w0 = img.width;
var h0 = img.height;
var w1 = Math.min(w0, 1000);
var h1 = h0 / w0 * w1;
canvas.width = w1;
canvas.height = h1;
ctx.drawImage(img, 0, 0, w0, h0,
0, 0, canvas.width, canvas.height);
// Here, the result is ready,
var data_src = canvas.toDataURL('image/jpeg', 0.5);
$('#img').attr('src', data_src);
URL.revokeObjectURL(imgURL);
};
img.src = imgURL;
});
});
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.1/jquery.min.js"></script>
<input id="upload" type="file" accept="image/*" />
<img id="img" />
问题
但是,我的代码仍然可以在移动设备上运行,而上述过程(调整大小和压缩)无法很快完成。它会导致 GUI 停止响应片刻。
我希望该过程在另一个线程中工作,使用 web worker。所以不会阻塞UI,用户体验会更好。
现在问题来了,网络工作者似乎无法处理画布,我该如何解决这个问题?
【问题讨论】:
-
你的图片有多大,所以加载会阻塞 UI?我认为使用 webworker 完成此类任务的唯一方法是提取画布的 imageData 并将其发送给 webworker,在那里你必须自己重写缩放/压缩算法...... getImageData/putImageData 是至少与您正在做的事情一样消耗CPU。你确定问题出在这个函数上吗?
-
使用 webworkers 将减少 UI 线程的延迟。只要设备对网络工作者有良好的支持,这将减少 UI 延迟。但是使用 webworkers 会增加整体负担,因为图像数据必须同时编组给 webworkers,然后在他们的工作完成时编组回来。
标签: javascript html image-processing canvas web-worker