ImageData 数组中的索引逻辑是什么?

2023-12-30

这个问题是为了更深入的理解我之前关于大尺寸Canvas动画的问题。问题在这里:重复 HTML 画布元素(框)以填充整个视口 https://stackoverflow.com/questions/65340502/repeat-html-canvas-element-box-to-fill-whole-viewport

我试图理解 TypedArray - Uint8ClampedArray 背后的逻辑。我将首先从我的研究开始,然后再讨论问题本身。

所以,ImageData代表HTML5 Canvas的像素数据。它可以实现更快的性能,并且适合重型动画。获得 ImageData 对象后,我们为其创建一个缓冲区空间。因为我们不能直接从缓冲区读取和写入,所以我们将此缓冲区传递给 TypedArray。在本例中,Uint8ClampedArray 就像普通数组一样,允许访问其中的数据。

画布上的每个像素都由 4 个整数值表示,分别代表红、绿、蓝、阿尔法(如 RGBA 中),范围从 0 到 255。每个值都分配给从 0 开始的 Uint8ClampedArray 索引,并且该数组被划分分成 4 个块。因此,前 4 个值是第一个像素,后 4 个值是第二个像素,依此类推。 Cavnas 像素从左到右逐行读取。

因此,如果我们想要获取位于处的像素红色值的数组索引xCoord = 3; yCoord = 1; canvasWidth = 10;。公式由MDN:使用画布进行像素操作 https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Pixel_manipulation_with_canvas建议我们进行以下数学计算:

var red = y * (width * 4) + x * 4;= 1 * 10 * 4 + 3 * 4 = 52;

但是,如果我们尝试手动执行相同的操作,并且只是逐个像素地计算自己,则不会得到相同的值。总是有点不对劲。我们如何手动计算?在这张图中我们从0 X 0 to 0 X 9 and to 1 X 3。因为我们从左上角开始向右移动,所以它是倒置的Y是我们的第一个坐标X是我们的第二个坐标。从0 X 0 to 0 X 9我们总共记录 40 个值(每个像素 4 个值,总宽度 10 个像素);从1 X 0 to 1 X 3我们总共记录了 16 个值。最后我们得到第 56 个索引,而不是我们使用公式计算的 52。

所以,请帮助我理解 Uint8ClampedArray 中的整个逻辑以及它是如何计算的。


从 1 X 0 到 1 X 3 我们总共记录了 16 个值

这 16 个字节中的最后 4 个字节确实表示 (3, 1) 处的像素。红色通道是其中的第一个通道,前面是左侧像素的 12 字节和第一行像素的 40 字节。它位于整个数组中的索引 52。

请记住数组有索引 https://softwareengineering.stackexchange.com/q/110804/66652 as

0   1   2
+---+---+--
|   |   |
+---+---+--

not as

+---+---+--
| 0 | 1 | 2
+---+---+--
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ImageData 数组中的索引逻辑是什么? 的相关文章

  • 在 javascript/jquery 中将光标更改为等待

    当调用函数时 如何让光标更改为此加载图标以及如何将其更改回 javascript jquery 中的普通光标 在你的 jQuery 中使用 body css cursor progress 然后又恢复正常 body css cursor d
  • 如何在同一页面上使用AJAX处理多个表单

    我有一个表单 当我单击 提交 时 它就被提交了 然后该表单隐藏 操作页面的结果显示在 div 中 classname dig 它工作正常 但是当我添加另一个表单时 它停止正常工作并且所有表单同时提交 我如何更改我的代码 done click
  • 从数据 URI 解码 QR 码

    我尝试从数据 uri 中解码二维码 var dataUri data image gif base64 R0lGODdh9gD2AIAAAAAAAP ywAAAAA9gD2AAAC decodeQrCode dataUri cb 我已经尝试
  • 每 3 秒重复一次动画

    我正在使用 WOW js 和 animate css 现在我正在将 CSS 运行到 Infinite 我想知道如何让我的课程运行 3 秒停止并再次开始到无限 My html img src images fork png class for
  • 如何重定向到 instagram://user?username={username}

    我的 html 页面上有这个链接 可以在特定用户上打开 Instagram 应用程序 a href Link to Instagram Profile a 我一直在寻找自动运行 url instagram user username USE
  • 使用模数按字母顺序对列表进行排序

    我在获取元素列表并按字母顺序对它们进行排序方面没有任何问题 但我很难理解如何使用模数来做到这一点 更新 这是按我的方式工作的代码 但是 我更喜欢下面提供的答案的可重用性 因此接受了该答案
  • 使用 jQuery/JS 打开时使
    标签的内容具有动画效果

    我只想要 HTML5 的内容details标记为 滑行 动画打开 而不是仅仅弹出打开 立即出现 这可以用 jQuery Javascript 实现吗 Fiddle http jsfiddle net 9h4Hq HTML
  • 如何防止 Iframe 在与浏览器交互后弄乱浏览器的历史记录?

    因此 就我而言 我使用 Iframe 将 Grafana 附加到我的页面 这为我提供了漂亮且易于使用的图表 可以注意到 每次在图表上进行放大或缩小 使用鼠标单击 交互后 Grafana 的 Iframe 都会在我的 Angular 页面上触
  • Google App Engine:修改云运行环境

    我正在尝试部署一个使用自定义 Node js 服务器的 Next js 应用程序 我想将自定义构建变量注入应用程序 next config js const NODE ENV process env NODE ENV const envTy
  • 如何监听 jQuery AJAX 请求?

    以下两种实现 ajaxRequest 1 2 的方法应该是等效的 话说回来 为什么验证回调已执行的单元测试 3 在 1 中成功而在 2 中失败 我应该如何重写测试 3 来监视 2 中的成功回调 如果我尝试stub jQuery ajax使用
  • Javascript正则表达式用于字母字符和空格? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我需要一个
  • 除了更改标题之外,如何在 Firefox 中强制另存为对话框?

    有没有办法在 ff 中强制打开 www example com example pdf 的另存为对话框 我无法更改标题 如果您可以将文件以 Base64 格式输出到客户端 则可以使用 data uri 进行下载 location href
  • 音频 blob 的 URL.createObjectURL 在 Firefox 中给出 TypeError

    我正在尝试从创建的音频 blob 创建对象 URLgetUserMedia 该代码在 Chrome 中可以运行 但在 Firefox 中存在问题 错误 当我打电话时stopAudioRecorder 它停在audio player src
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • 在 C 中匹配二进制模式

    我目前正在开发一个 C 程序 需要解析一些定制的数据结构 幸运的是我知道它们是如何构造的 但是我不确定如何在 C 中实现我的解析器 每个结构的长度都是 32 位 并且每个结构都可以通过其二进制签名来识别 举个例子 有两个我感兴趣的特定结构
  • 表单计算器脚本基本价格未加载 OnLoad

    我的表单中有一个计算器来计算我的下拉选项选择 function select calculate on change calc input type checkbox calculate on click calc function cal
  • 如何使输入字段和提交按钮变灰

    我想变灰这两件事 http doorsplit heroku com 歌曲输入字段和提交按钮 直到用户输入艺术家 有没有一种简单的方法可以通过 JQuery 来做到这一点 艺术家输入字段的id是 request artist 你可以这样做
  • Firefox 书签探索未超过 Javascript 的第一级

    我已经编写了一些代码来探索我的 Firefox 书签 但我只获得了第一级书签 即我没有获得文件夹中的链接 e g 搜索引擎 雅虎网站 谷歌网站 在此示例中 我只能访问 Search engines 和 google com 不能访问 yah
  • Javascript 数组到 VBScript

    我有一个使用 Javascript 构建的对象数组 我需要使用 VBScript 读取它 如下例所示 我找不到在 VbScript 代码中循环遍历数组的方法myArray object 这个例子是我的问题的简化 我无法更改页面的默认语言 这
  • Javascript转换时区问题

    我在转换当前时区的日期时间时遇到问题 我从服务器收到此日期字符串 格式为 2015 10 09T08 00 00 这是中部时间 但是当我使用 GMT 5 中的 new Date strDate 转换此日期时间时 它返回给我的信息如下 这是不

随机推荐

  • Xpath:从 id 属性与 id 锚点的匹配中查找元素值

    我想找到与 id 属性匹配的元素的值 我只有 ref 带 的位 锚点 我正在寻找 partyId 的值 lt party id partyA gt lt partyId gt THEID lt partyId gt 但要到达那里 我只有以下
  • 如何将受信任的证书添加到 OkHttp

    我需要使用 OkHttp 客户端信任一个特定站点的证书 我在这里找到了解决方案 https jebware com blog p 340 https jebware com blog p 340 这段代码与我想要信任的服务器配合得很好 唯一
  • Android 外部存储与 SD 卡

    阅读有关存储文件的 Android 文档后 我发现外部存储可以包括可移动 SD 卡和设备内部存储 即不可移动 选择将文件保存到外部存储时 是否可以区分可移动存储和不可移动存储 我认为您无法可靠地区分内部和外部 SD 存储 乍一看 您似乎可以
  • 如何在imageView上显示从内部存储中选择的图像?

    我是在 android 中处理图像的新手 我想从内部存储加载图像 但它给了我权限被拒绝错误 然后我已将权限添加到 android 清单文件 但我仍然无法完成我的任务 这是我的代码 import android graphics Bitmap
  • 将Google Data Studio连接到本地Mysql服务器

    我已经开始使用 Google 的 Data Studio 我发现只需很少或根本不需要编码技能 就可以轻松地将 Excel 数据转换为直观的业务仪表板 但我这里有一个问题 每当我尝试连接到 Mysql DB 在我的本地系统上运行 时 我都会遇
  • 在 C# winform 中如何识别应用程序显示在哪个监视器上

    重复的如何在 C 中找到应用程序正在哪个屏幕上运行 https stackoverflow com questions 549751 how do i find what screen the application is running
  • 应用程序无法搭建项目

    我在 VS 2013 Professional 中创建了一个 MVC 5 应用程序 然后首先将 EF 6 1 代码与 SQL Server Express 上的现有数据库一起使用 当我尝试创建视图时 我使用 新脚手架项目 然后选择 带有视图
  • 安卓内部存储

    我需要在手机内存中存储一 个对象 如何在 Android 中执行此操作 希望您觉得这个博客有用 http pierrchen blogspot com 2011 11 android storage html http pierrchen
  • 在 Matlab 用户界面中跨多个 m 文件搜索文本

    有办法吗withinmatlab 用户界面在多个 m 文件中搜索某些文本 按 Ctrl Shift f 或转到菜单 编辑 gt 查找文件 您将得到一个很好的对话框 希望它能够满足您的要求
  • .htaccess 错误 - ERR_TOO_MANY_REDIRECTS

    我有这个 htaccess 文件要重定向http to https 我也做了www 到根域重定向 www 到根域有效 然而https 重定向没有 如果我设置RewriteCond HTTPS on to RewriteCond HTTPS
  • MongoDB bind_ip 错误:bind() 失败 errno:99 无法为套接字分配请求的地址

    我想配置 mongodb 以允许来自外部 IP 地址的远程连接 例如66 31 123 123 Setting 0 0 0 0 to bind ip可行 但我想更加严格 只允许某些 IP 地址进行连接 我附加了66 31 123 123 t
  • 如何在 asp.net 会话变量过期之前执行服务器端代码?

    在我的 asp net 网站中 我在用户登录时创建一个会话 我想在该会话到期之前在数据库中执行一些操作 我在确定应该在哪里编写代码以及如何知道会话时遇到问题即将过期 我不确定 Global asax 的 session end 事件是否适合
  • 如何访问第二个麦克风 Android(例如 Galaxy 3)

    现在很多智能手机都有不止一个麦克风 一个用于语音输入 另一个用于减少环境噪音 我想知道如何独立访问两个麦克风的信号 或者关闭其中一个麦克风 欢迎任何想法或评论 多谢 我对 Galaxy S3 不太熟悉 但以下情况适用于我使用过的大多数设备
  • strtotime 结果没有意义,php bug?

    以下行 echo date d strtotime First Saturday August 2015 prints 08 这似乎没有任何意义 因为一周中的某一天第一次出现不能在 7 号之后 这是一个 php bug 还是一个 php b
  • Android 开发:“线程因未捕获的异常而退出”

    我正在尝试创建我的第一个 Android 应用程序 游戏 但开始时遇到一些困难 当我运行我的代码时 我收到以下错误日志 05 25 02 41 51 022 WARN dalvikvm 634 threadid 1 thread exiti
  • UIView 动画块暂停动画和完成代码

    我有一个动画块来执行基于简单变换的动画 完成后将从其超级视图中删除有问题的视图 UIView msgView UIView alloc initWithFrame CGRectMake 160 120 160 100 Do stuff to
  • 文件夹内的批处理文件创建 MediaInfo.nfo 文件

    我正在尝试创建一个批处理 其目的是使用 MediaInfo exe CLI 创建一个包含文件夹中包含的视频文件的所有 mediainfo 的文本文件 nfo 批处理是从上下文菜单中执行的 右键单击包含视频文件的文件夹 为此 该文件将被放置在
  • 如何从 CLGeocoder 获取多个地标

    无论我向地理编码器提供什么地址 geocoder geocodeAddressString completionHandler 它总是只在地标数组中放置一个对象 我有什么方法可以获得多个结果 例如在地图应用程序中 用户可以从中选择一个结果
  • Visual Studio 解决方案中的多个 Web 应用程序项目

    我目前正在开始使用 ASP Net Webforms 开发一个新网站 为了让这个项目有一个正确的开始 我正在研究应用程序的 Visual Studio 解决方案设置 我希望我的应用程序由大小 代码行 相同的易于识别的组件组成 由于该项目尚未
  • ImageData 数组中的索引逻辑是什么?

    这个问题是为了更深入的理解我之前关于大尺寸Canvas动画的问题 问题在这里 重复 HTML 画布元素 框 以填充整个视口 https stackoverflow com questions 65340502 repeat html can