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 数组中的索引逻辑是什么? 的相关文章

随机推荐

  • 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