编辑后将大画布保存为数据URI
Saving a large canvas as a data URI after editing
我已经从服务器加载了一个47MB的图像文件,并将其呈现在画布上进行编辑。
编辑后,当我试图获取图像的数据URI时,浏览器会冻结,然后询问是否应该停止脚本。
我目前正在使用此代码获取数据URI:
drawingCanvas.toDataURL("image/png");
获取JPEG数据URI稍微快一些,但我只需要文件是PNG格式。有什么办法让这更快吗?
此文件太大,无法通过数据URI进行处理。不同浏览器都有限制,请参阅数据协议URL大小限制
您可以尝试将base64编码的数据发布到服务器,对其进行解码,然后获得普通图像。用PHP提供了简化的解决方案,但环境并不重要。
list($type, $data) = explode(';', $_POST['data']);
list(, $base64) = explode(',', $data);
unset($data);
$decoded = base64_decode($base64, true);
unset($base64);
if (false !== $decoded) {
header('Content-type: ' . $type);
header('Content-Disposition: attachment; filename="file.png"');
header('Cache-Control: max-age=0');
echo $decoded;
} else {
header($_SERVER['SERVER_PROTOCOL'] . ' 500 Internal Server Error', true, 500);
}
没有。PNG编码本身是一个相对缓慢的过程(在Photoshop等应用程序中保存的大图像中也可以看到这一点)。
加快速度的唯一有效方法是减小要编码的画布位图的大小-浏览器不是处理大型数据的最佳工具,例如大型图像文件(按维度),它们从来都不打算做这类事情。
将其分解为多个部分可以帮助您解除对UI的锁定。但是,由于您不能并行编码它们,并且在生成Base-64编码的数据uri时会有开销,因此您需要使用async setTimeout给浏览器一些时间来解析每个切片之间的事件队列,当然,您必须在某个点、某个地方将它们拼凑在一起,因此这会使速度变慢,更容易出错,总体上更复杂(复杂并不一定是坏事,尽管在这种情况下)。如果不能选择缩小位图大小,这可能是您的最佳选择。正如Max所指出的,数据uri有大小限制。
您可以使用getImageData()
转储原始缓冲区,但最终会得到一个原始大小的缓冲区,该缓冲区还有一系列其他含义。
理论上,共享网络工作者可以并行地进行编码,但很可能比让浏览器在编译后的代码中进行编码慢得多。你也必须提供代码来进行编码。。。与许多新事物一样,它还没有得到充分或完全的支持。
- 如何在服务器上保存数据以备日后使用
- zp.midpass.ru如何在浏览器中保存数据
- Google Chrome扩展在本地保存数据
- Javascript/AngularJS本地保存数据
- jquery ajax到php脚本不保存数据
- 使用LocalStorage保存数据
- jquery保存数据,直到phonegap应用程序关闭
- 以HTML和javascript保存数据
- 单击指向外部网站的链接后,通过MySQL保存数据
- AngularJS:无法保存数据
- 如何在不编码或保存数据的情况下将二进制数据从javascript传递到actionscript(网页到flash)
- 如何在AngularJS中刷新时在服务中持久保存数据
- 如果从浏览器控制台提交,Knockoutjs不会保存数据
- 在nodejs中执行procces数组时保存数据
- MongoDB 在保存数据时抛出错误(拓扑已损坏)
- HTML 在表单之间保存数据
- HTML/JS - 保存数据-* 供以后使用
- 保存数据 asp.net 后单击按钮时显示警报消息
- Chrome 扩展程序保存数据
- 如何在应用程序上保存数据