后台设置
我有一个Web应用程序,处理从一组其他图像创建图像.我选择这样做的方法是通过读取一组图像并将它们放在HTML画布上.然后,我将每个画布作为jpeg导出到第三方API toDataURL,并将其转换为Blob.我面临的问题是,我有很多这些画布都将数据导出为jpg,并且消耗了大量资源.当每个画布尝试调用时,应用程序会变慢并变得无响应toDataURL.
题
我发现调用画布toDataUrl()或者toBlob()可能非常慢,特别是对于大画布尺寸.我想利用Web worker的多线程特性.
首先,我尝试传入canvas对象但是抛出了一个错误.事实证明,对象是一个问题,它们似乎要么被转换为字符串,要么在无法克隆时失败.无论哪种方式,我发现传递上下文的图像数据确实有效.数据以原始RGB值的形式传递,作为Uint8ClampedArray画布上下文的方法getImageData().
Main.js
var canvas = document.createElement('canvas');
var context = canvas.getContext('2d');
var worker = new Worker('myWorker.js');
worker.postMessage({
image: context.getImageData(0, 0, canvas.width, canvas.height)
});
Run Code Online (Sandbox Code Playgroud)
myWorker.js
this.onmessage = function(e) {
// GOAL: turn e.data.image into an image blob or dataUrl and return it.
// e.g. this.postMessage(new Blob([e.data.image.data], {type: 'image/jpg'});
}
Run Code Online (Sandbox Code Playgroud)
我认为归结为知道如何将Uint8ClampedArray包含RGB信息的转换为jpg/png数据.
我认为这可能有用的原因是我认为getImageData只是从画布上下文复制现有的数据结构,因此没有那么昂贵toDataUrl.我在调用类似于下面代码块的内容时捕获了cpu配置文件:
var image = context.getImageData(0, 0, canvas.width, canvas.height)
var …Run Code Online (Sandbox Code Playgroud) UIView animateWithDuration 的文档说在动画期间所有用户交互都被阻止。但我想知道它是否也会在预动画延迟期间阻塞。
该文件说:
“在动画过程中,正在动画的视图的用户交互被暂时禁用。(在 iOS 5 之前,整个应用程序的用户交互被禁用。)如果您希望用户能够与视图交互,请将 UIViewAnimationOptionAllowUserInteraction 常量包含在选项参数。”
但是当我给出明显的延迟(假设是 1 秒)时,它也会在那一秒内阻止 UI。我不认为是这种情况,因为延迟参数的文档说:
“在开始动画之前等待的时间(以秒为单位)。指定值 0 以立即开始动画。”
关键词有前开始的动画,而有关阻止有关用户交互的会谈笔记动画中。
但是,我的应用程序在预动画延迟期间不会更新 UI。延迟是否也会阻止 UI 交互,或者我的 UI 是否因其他原因被阻止?
canvas ×1
getimagedata ×1
ios ×1
javascript ×1
objective-c ×1
todataurl ×1
uiview ×1
web-worker ×1