如何从我不拥有的画布中获取像素数据?

2023-12-08

我正在尝试从画布获取像素 RGBA 数据以进行进一步处理。我认为画布实际上是一个 Unity 游戏,如果这有什么不同的话。

我正在尝试用游戏的画布来做到这一点颤抖和坐立不安。我用读取像素方法从context.

这是我尝试过的:

var example = document.getElementById('#canvas');
var context = example.getContext('webgl2');      // Also doesn't work with: ', {preserveDrawingBuffer: true}'
var pixels = new Uint8Array(context.drawingBufferWidth * context.drawingBufferHeight * 4); 
context.readPixels(0, 0, context.drawingBufferWidth, context.drawingBufferHeight, context.RGBA, context.UNSIGNED_BYTE, pixels);

但所有像素显然都是黑色的(这显然不是真的)。

编辑:另外,我想多次读取像素。 谢谢大家的回答。提供的答案是@Kaiido非常适合我:)


您只能需要一次 Canvas 上下文。以下所有请求都将返回null,或者如果您将相同的选项传递给之前创建的相同上下文getContext().

现在,您链接到的页面没有通过preserveDrawingBuffer创建上下文时的选项,这意味着为了能够从那里获取像素信息,您必须连接到与游戏循环发生的事件循环相同的事件循环中。
幸运的是,这个游戏确实使用了一个简单的requestAnimationFrame循环,因此要连接到相同的事件循环,我们需要做的就是将代码包装在requestAnimationFrame call.

由于回调是堆叠的,并且它们确实需要此类回调的下一帧来创建循环,因此我们可以确定我们的调用将在它们之后堆叠。

我现在意识到这可能并不明显,所以我将尝试进一步解释什么请求动画帧确实如此,以及我们如何确保我们的回调将在 Unity 的回调之后被调用。

requestAnimationFrame(fn) pushes fn回调到一堆回调中,这些回调将在浏览器执行其操作之前以先进先出的顺序同时调用绘制到屏幕上运营。这种情况偶尔会发生一次(通常每秒 60 次),发生在最近的事件循环结束时。
可以理解为一种setTimeout(fn , time_remaining_until_next_paint),主要区别是保证请求动画帧回调执行器将在事件循环结束时被调用,因此在该事件循环的其他 js 执行之后。
所以如果我们打电话requestAnimationFrame(fn)在调用回调的同一事件循环中,我们的假time_remaining_until_next_paint将会0, and fn将被推入堆栈的底部(后进,后出)。
并且打电话的时候requestAnimationFrame(fn)从回调执行器本身内部,time_remaining_until_next_paint周围会有一些东西16, and fn将在下一帧的第一个中被调用。

所以任何电话requestAnimationFrame(fn)由外部制成请求动画帧的回调执行器保证在同一个事件循环中被调用requestAnimationFrame 供电循环,并在之后调用。

所以我们需要抓取这些像素,就是将调用包装到读取像素 in a 请求动画帧调用,并调用它afterUnity 的循环开始了。

var example = document.getElementById('#canvas');
var context = example.getContext('webgl2') || example.getContext('webgl');
var pixels = new Uint8Array(context.drawingBufferWidth * context.drawingBufferHeight * 4);
requestAnimationFrame(() => {
  context.readPixels(0, 0, context.drawingBufferWidth, context.drawingBufferHeight, context.RGBA, context.UNSIGNED_BYTE, pixels);
  // here `pixels` has the correct data
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何从我不拥有的画布中获取像素数据? 的相关文章

随机推荐

  • NSDate 一天的开始和一天的结束

    NSDate beginningOfDay NSDate date NSCalendar cal NSCalendar currentCalendar NSDateComponents components cal components N
  • 如何在android中使用Gson库解析json响应?

    我有 api 它的响应如下 0 serialize 1 login users token aaaaa message login successful 我如何使用 Gson 在 android 中解析它 创建一个 Json 的 pojo
  • 为什么 Tiles REGEXP 通配符定义会导致无尽的 jsp 包含错误

    我将tiles 2 2 2与Struts2 2 2 3一起使用 因为Struts2 Tiles插件相当旧 它的实现使用了许多Tiles已弃用的API 并且我想尝试REGEXP通配符 所以我在下面实现了我自己的监听器 我的TilesConta
  • 来自后台工作人员的文本框文本?

    我一直在试图弄清楚如何从后台工作人员中获取文本框的文本或其他属性 有人知道怎么做这个吗 我无法将其作为参数传递 因为它需要是实时的 谢谢您的帮助 我认为你只需要调用该属性 伪代码 private void bgw1 DoWork objec
  • 向订阅该主题的所有用户推送通知(使用 FCM Firebase 的登录用户除外)

    现在我有一个拥有一万多名成员的群组 并且我为一个群组创建了一个主题 通知主题 该群组中的所有用户都订阅了该主题 现在 在组内任何用户都可以添加图像 文件或视频等帖子 当用户添加帖子时 我需要向订阅该主题的所有用户发送通知 但除了一个之外 即
  • 如何检测 CMake 中的意外函数覆盖?

    我刚刚在我的 CMake 代码中发现了复制和粘贴错误 function name do something endfunction function name do something else endfunction 我已经多次复制 重命
  • SKLabelNode 将消失但仍然可点击

    我正在使用 SpriteKit 和 Swift 制作一个游戏 运行 Xcode 6 我有一个SKLabelNode 我们称之为myLabelNode对于这个例子 当我打电话时myLabelNode removeFromParent 它会像它
  • C# StreamReader 从标签输入文件?

    我一直在使用StreamReader inputFile代码来自ListBox它效果很好 但是 我想输入来自 txt文件到一个Label盒子代替 这可能吗 这是我尝试过的代码 它给了我一个错误描述 说明 Use of unassigned
  • 如何为 UIPageViewControllerDataSource 提供默认实现?

    我认为这个问题的答案通常会解决 Objective C 协议的问题 但这是我遇到的第一个问题 我希望在实施时使用这些方法UIPageViewControllerDataSourceWithConnections import UIKit p
  • 是否有*任何*情况下“for _ in [1,2,3]”根本不会循环?

    我正在编写一些代码并犯了一个错误 该错误简化为 func f gt Int for in 1 2 3 return 1 编译器向我显示一个错误 指出f缺少回报 这让我意识到我的错误 我忘记在周围放置一个 if 语句return 但后来我意识
  • python 多处理队列实现

    我无法理解如何将队列实现到下面的多处理示例中 基本上 我希望代码能够 1 产生2个进程 完成 2 将我的 id list 分成两部分 完成 3 让每个进程迭代列表 打印出每个项目 并且仅在完成列表后才关闭 我知道我必须实现某种类型的排队系统
  • 如何使用ajax从html获取数据并将数据传递到php

    您好 我很想知道如何将字符串从表单传递到 php 该 php 将测试其中是否有内容 然后使用此表单发布一条警报消息 尝试从中获取数据 然后显示它是否已通过正确 HTML 代码
  • 在 Android 中使用 NanoHTTPD

    我正在尝试使用 NanoHTTP 来提供 HTML 文件 然而 NanoHTTP 相对来说没有文档记录 而且我对 Android 还很陌生 我的问题是 我在哪里存储 html 文件 以及如何使用 NanoHTTP 提供它 答案很晚 但可能对
  • 如何从 Java 9+ 中的目录动态加载模块

    我一直在开发一个带有基于插件的系统的软件 用户可以在其中编写自己的插件 我对 JMPS 很陌生 但我想使用 JMPS 而不是 OSGi 来实现这一点 制作了一个单独的 API 模块 甚至创建了一个测试插件 插件以文件名 someplugin
  • UTC_TIMESTAMP() 是否受夏令时影响?

    我正在编写一个具有时段预订系统的应用程序 用户可以位于不同的时区 因此我需要以 UTC 时间将值存储在数据库中 我想知道如何UTC TIMESTAMP 是在MySQL中计算的 可靠吗 如果服务器时区位于夏令时地区UTC TIMESTAMP
  • Laravel 多文件上传验证

    我目前正在以一种形式工作 我在多个文件上传验证方面遇到一些问题 我的表单中只有一个字段允许上传多个文件
  • 如何在 pyplot 中的分组条形图中标记组?

    我想在 pyplot 中做类似以下的事情 我也可以在其中标记条形图和组 我能够标记条形 但不知道如何标记组 谢谢 默认的Seaborn 条形图会创造一个传说来显示岁月 import numpy as np import pandas as
  • C# - httpWebRequest 流的大小是否有限制?

    我正在尝试构建一个应用程序 使用 httpwebrequests 从自定义网络服务器下载一个小二进制文件 20 25 KB 这是服务器端代码 Stream UpdateRequest context Request InputStream
  • 从 HEVC 参考软件获取一些信息

    我是 HEVC 新手 现在正在了解参考软件 现在正在研究帧内预测 编码后我需要获取如下信息 给定 CTU 的 CU 结构 对于计算期间的每个 CU 它是信息 例如 QP 值 选择的亮度模式 选择的色度模式 CU 是否处于 CTU 分割决策的
  • 如何从我不拥有的画布中获取像素数据?

    我正在尝试从画布获取像素 RGBA 数据以进行进一步处理 我认为画布实际上是一个 Unity 游戏 如果这有什么不同的话 我正在尝试用游戏的画布来做到这一点颤抖和坐立不安 我用读取像素方法从context 这是我尝试过的 var examp