使用 image.onload 将多个图像绘制到画布上

2023-12-24

当我尝试在画布上绘制大型二维图像数组时遇到问题。我使用一个单独的程序,获取一个大图像文件,并将其分解为更小的、统一的部分。我使用 2D 数组来表示图像的“网格”,理想情况下,当我分配网格中每个元素的 src 时,一旦准备好,该图像就会被绘制到画布上的正确位置。但是,我的代码不起作用。

var grid = new Array()  
/*grid is set to be a 2D array of 'totalRows' rows and 'totalCols' columns*/  

/*In the following code, pieceWidth and pieceHeight are the respective height/widths  
of each of the smaller 'pieces' of the main image. X and Y are the coordinates on  
the canvas that each image will be drawn at. All of the images are located in the  
same directory (The src's are set to http://localhost/etc), and each individual  
filename is in the form of name(row*totalRows + col).png, ex, traversing the 2D  
array left to right top to bottom would give image1.png, image2.png, etc*/  

for (var row = 0; row < totalRows; row++)  
    {  
        for (var col = 0; col < totalCols; col++)  
        {  
            grid[row][col] = new Image();  
            var x = col * pieceWidth;  
            var y = row * pieceHeight;  
            grid[row][col].onload = function () {ctx.drawImage(grid[row][col], x, y);};  
            grid[row][col].src = "oldimagename" +  ((row * totalRows) + col) + ".png";  
        }  
    }  

我尝试在 Opera、Firefox、Chrome 和 Safari 中运行此代码。 onload 事件在 Opera、Chrome 和 Safari 中根本不会触发(我在 onload 函数中放置了一个警报,但它从未出现过)。在 Firefox 中,仅触发第一个图像 (grid[0][0]) 的 onload 事件。但是,我注意到,如果我在设置当前元素的 src 之后立即发出警报,则 Firefox 中的每个 onload 事件都会被触发,并绘制整个图像。理想情况下,我希望它能在所有 4 个浏览器中工作(我认为 IE 不会工作,因为它不支持 Canvases),但我只是不知道发生了什么。任何帮助/意见表示赞赏。


我认为问题在于你没有将变量放入闭包中。更改这一行:

grid[row][col].onload = function () {ctx.drawImage(grid[row][col], x, y);};

To

grid[row][col].onload = function () {window.alert('row:' + row + ' col:' + col);};

And 你会看到什么 http://www.boogdesign.com/examples/canvas/multiple-onload-broken.html是您的警报在每次调用时返回相同的行和列值。你需要得到这些包含在闭包中的变量 http://blog.leosoto.com/2007/10/javascript-closures-and-parameter.html这样您的函数就可以处理值而不是引用:

var drawCanvasImage = function(ctx,grid,row,col,x,y) {
    return function() {
        ctx.drawImage(grid[row][col], x, y);
    }
}

Then do:

grid[row][col].onload = drawCanvasImage(ctx,grid,row,col,x,y);

此示例页面 http://www.boogdesign.com/examples/canvas/multiple-onload.html我在 Firefox 和 Chrome 中工作。

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

使用 image.onload 将多个图像绘制到画布上 的相关文章

随机推荐

  • 使用knockout js上传文件

    使用knockout js 无法上传文件 我尝试过下面的代码但不起作用 请指出我哪里做错了 这是我的文件控件和按钮 我无法将所选文件从客户端发送到服务器 请建议最好的方法是什么
  • 无法渲染动画

    我正在尝试学习如何使用 R 和 gganimate 获得漂亮的动画图形 但遇到了一些问题 当我尝试为图形设置动画时 R 似乎编辑了一些 PNG 文件 但随后无法渲染它们 这是我使用的代码示例 首先加载 tidyverse gganimate
  • 使用 jquery 切换显示\隐藏但具有多个 id

    我有一个 php 页面 它生成多个 UL 和每个 UL 上方的链接 如下所示 a title Category one Category one a ul li Subcategory li li li li Subcategory li
  • 获取异步任务的结果

    我想从异步任务中获取结果 如果我使用task execute get 我的UI将被冻结 我希望我的异步任务是独立的类 所以我不想将结果处理代码放在 onPostExecute 中 我在这里找到了一些有关异步任务回调数据的信息 http bl
  • 如何改进 Excel 数据连接的刷新?

    和许多人一样 我有一个电子表格 可以从 40 多个文本文件中提取数据作为数据源 文本文件来自另一个应用程序 需要定期更新到 Excel 中 数据源文件和电子表格集需要能够复制并在不同的系统上运行 这就是 Excel 惊人地无法支持从电子表格
  • com.opensymphony.xwork2.inject.DependencyException: com.opensymphony.xwork2.inject.ContainerImpl$MissingDependencyException

    在部署我的战争文件时 我收到以下异常 SEVERE Exception starting filter struts2 com opensymphony xwork2 inject ContainerImpl MissingDependen
  • Python中列表的大小调整因子是多少

    例如 ArrayListJava 中的 s 的大小调整因子为 2 ArrayList当空间不足时 该数组的所有元素都会转移到一个新数组 该新数组的大小是原始数组的 2 倍 由于 Python 列表 数组本质上是动态的 那么它们的大小调整因子
  • 将宽字符串文字与字符串宏相结合

    我有一个字符串宏 如下所示 define APPNAME MyApp 现在我想通过执行以下操作来使用此宏构造一个宽字符串 const wchar t AppProgID APPNAME L Document 但是 这会生成 连接不匹配的字符
  • Google Sheets 组合骰子的公式

    情况 我正在创建一个骰子符号 清理 公式 以便将类似的骰子组合起来 例如 1D6 1D6 将变为 2d6 使事情变得复杂的是 负掷骰 如 1D6 不能汇总到最终结果中 意思是 1D6 1D6 不等于 0 为什么 因为 1D6 并不等于每次滚
  • sqlite3:由于未最终声明而无法关闭

    我有两个 sqlite 连接并按如下方式执行 CMyDatabase 是 sqlite3 的派生类 CMyDatabase dbConnection1 new CMyDatabase dbConnection1 gt OpenDataBas
  • 布局更改时的动画

    每次调整窗口大小时 JavaFX 中的基本 FlowPane 都会对其中的项目进行布局 然而 没有动画 结果相当不和谐 我在 FlowPane 内每个节点的layoutX 和layoutY 属性上连接了一个更改侦听器 结果或多或少有效 但有
  • 如何在 C++ 中声明高分辨率时钟的变量?

    在这里的例子中 https en cppreference com w cpp chrono high resolution clock now https en cppreference com w cpp chrono high res
  • 在 C 中交换数字中的位[重复]

    这个问题在这里已经有答案了 在一次 C 面试中 我被要求将数字的前 4 位与最后 4 位交换 例如 1011 1110 应为 1110 1011 有人有解决方案吗 如果您还没有见过或做过很多事情 那么一个很好的学习资源是 位摆弄黑客 htt
  • 错误 > 无法通过端口 8080 连接到 Cloud Shell > 使用代码服务器连接 Visual Code 时

    尝试在 VM 实例中安装 Visual Code IDE 运行代码服务器后 在检查浏览器上的视图时 出现错误 错误 无法连接到端口 8080 上的 Cloud Shell 确保您的服务器正在侦听端口 8080 然后重试 在此输入图像描述 h
  • React recaptcha google根本不显示

    我已经安装了react recaptcha google并按照此处的示例添加到我的应用程序中 https medium com codeep io how to use google recaptcha with react 38a5cd5
  • 如何从仅使用 GPU 访问创建的 IDXGISurface 中获取像素数据?

    概括地说 我想要完成的是捕获 部分 屏幕并将捕获的内容转换为数字图像格式 以下步骤概述了我认为的解决方案 设置一个Direct3D11CaptureFramePool https learn microsoft com en us uwp
  • Rails 5 data-method=delete 发送 GET 请求

    我在设置要删除的 http 动词时遇到问题 这是我在 Rails 5 中的第一个应用程序 我也在使用购买的主题 所以我确信我错过了一些愚蠢的东西 当我创建以下链接时 I get a href users sign out Sign out
  • 用于接受有效主机名、IPv4 或 IPv6 地址的 Java 正则表达式

    有人有一个好的 最好是经过测试的 正则表达式来仅接受有效的 DNS 主机名 IPv4 或 IPv6 地址吗 我明白你可能是forced使用正则表达式 但是 如果可能的话 最好避免使用正则表达式来执行此任务 而使用 Java 库类来进行验证
  • 将对象转换为原始 int

    如何将对象 不是字符串 例如 TreeNode item 转换为原始类型 例如 int 回应您的最后评论 只需仔细检查该对象确实是 Integer 类型 然后使用自动装箱 我假设您的编译器级别为 1 5 Object o getTheVal
  • 使用 image.onload 将多个图像绘制到画布上

    当我尝试在画布上绘制大型二维图像数组时遇到问题 我使用一个单独的程序 获取一个大图像文件 并将其分解为更小的 统一的部分 我使用 2D 数组来表示图像的 网格 理想情况下 当我分配网格中每个元素的 src 时 一旦准备好 该图像就会被绘制到