小编Ken*_*lis的帖子

是否可以从画布上下文的getImageData在Web worker中生成图像(blob或data-url)?

后台设置

我有一个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)

javascript canvas getimagedata web-worker todataurl

9
推荐指数
1
解决办法
2635
查看次数

带有延迟的 UIView 动画会阻止 UI 交互?

UIView animateWithDuration 的文档说在动画期间所有用户交互都被阻止。但我想知道它是否也会在预动画延迟期间阻塞。

文件说:

“在动画过程中,正在动画的视图的用户交互被暂时禁用。(在 iOS 5 之前,整个应用程序的用户交互被禁用。)如果您希望用户能够与视图交互,请将 UIViewAnimationOptionAllowUserInteraction 常量包含在选项参数。”

但是当我给出明显的延迟(假设是 1 秒)时,它也会在那一秒内阻止 UI。我不认为是这种情况,因为延迟参数的文档说:

“在开始动画之前等待的时间(以秒为单位)。指定值 0 以立即开始动画。”

关键词有前开始的动画,而有关阻止有关用户交互的会谈笔记动画中

但是,我的应用程序在预动画延迟期间不会更新 UI。延迟是否也会阻止 UI 交互,或者我的 UI 是否因其他原因被阻止?

objective-c uiview ios

2
推荐指数
1
解决办法
682
查看次数