【发布时间】:2014-06-06 19:11:50
【问题描述】:
问题
我可以成功完成以下步骤,但 UI 可能对 2 MB 或更大的文件无响应。这些文件的大小在用户可能从他们的相机或桌面上传的范围内,所以我需要处理它们。
-
用户使用标准文件输入 HTML 元素上传文件:
<input class="cancel" type="file" name="userFile" id="userFile" accept="image/*"/> 在客户端,我调整文件大小,使宽度为 500 像素或更小(特别是为了减小大文件的图像大小)并显示图像。
在客户端,我上传了调整大小的较小文件。
演示
请参阅 this fiddle。
您可以看到- 在上传较大的文件时停止移动。 Chrome 中的延迟似乎比 Firefox 更大,但在 Firefox 上仍然很明显。
阻塞原因
-
在img src 上设置文件数据URL 时。这是必需的,以便可以在画布中调整图像的大小。
img.src = e.target.result;//blocking here -
当 img 被写入画布时。这是调整图像大小所必需的。
ctx.drawImage( img, 0, 0, width, height );//blocking here
我考虑过的选项
在 Web Worker 中执行阻止操作。这是不可能的,因为 Web Worker 无法操作 DOM 元素,并且在操作 DOM 时都会发生阻塞调用。
在 Web Worker 中调整原始图像数据的大小。不幸的是,我不知道 img 的格式是什么,因此调整大小需要处理所有图像类型。我不知道有任何 JavaScript 库可以做到这一点,我也不想编写自己的跨格式图像压缩库。
直接调整img大小,但这不会改变需要上传的底层数据大小。
在服务器上调整大小不是一种选择,因为我想减小上传大小。在客户端调整大小也更好,因为大图像的内存被提前释放并且调整大小的图像立即显示。
其他想法
我知道设置img src是异步的,所以我猜是数据的复制导致了阻塞。我想知道是否有一种方法可以共享相同的数据而不是复制?
我正在使用我认为是使用 FileReader 获取数据 URL,然后将数据 URL 设置为 img.src 和 canvas.drawImage 的标准方法来调整大小(有很多这样的例子,一个是here)。任何有助于提高这种方法或另一种方法的响应能力的帮助将不胜感激。
【问题讨论】:
标签: javascript html html5-canvas