应用旋转时,HTML5 canvas Clip() 在 Chrome 中不起作用

2024-05-20

我试图在画布上使用剪辑区域,一旦坐标系旋转任何非零值,它就会停止工作:

   window.onload = function() {
      var canvas = document.getElementById("mainCanvas");
      var ctx = canvas.getContext("2d");

      ctx.rotate(Math.PI / 8); // !!! Clipping doesn't work with any non zero value

      ctx.beginPath();
      ctx.rect(0, 0, canvas.width, canvas.height);
      ctx.stroke();
      ctx.clip(); // !!! Image below is invisible in Chrome when clip() is enabled
      
      var objectImage = document.getElementById("test");
      ctx.drawImage(objectImage, 0, 0);
   }
<canvas id="mainCanvas" width="320" height="240" style = "border:1px solid #d3d3d3;"></canvas>
<img id="test" width="0" height="0" src="https://dl.dropboxusercontent.com/u/4111969/test.png">

该代码在 Firefox 中运行良好:

但在 Chrome 中,矩形内的图像是空的:

平移和缩放变换似乎工作正常,但旋转却不行。难道我做错了什么?如果这是 Chrome 中的错误,有没有好的解决方法?

Edit:

我的系统是: Chrome“版本 49.0.2623.87 m”、Windows 7 Home Premium SP1、华硕 R7 250X 显卡。我每次都能重现这个问题。

我发现如果我这样做,问题就会消失关闭硬件加速在浏览器设置中。据我了解,这意味着我的显卡驱动程序可能有问题。

有没有办法让我的网页强制在 Chrome 中进行软件渲染?


在 Chrome 中,drawImage() 是在加载图像之前完成的,你必须像这样检查:

<!DOCTYPE HTML>
<html>
<script>
      window.onload = function() {
      var canvas = document.getElementById("mainCanvas");
      var ctx = canvas.getContext("2d");
      ctx.rotate(Math.PI / 8); // !!! Clipping doesn't work with any non zero value
      ctx.beginPath();
      ctx.rect(0, 0, canvas.width, canvas.height);
      ctx.stroke();
      ctx.clip(); 
      
      //Make sure the Image is loaded
      var objectImage= new Image();
      objectImage.src="https://dl.dropboxusercontent.com/u/4111969/test.png"
      objectImage.onload =function()
      {
           ctx.drawImage(objectImage, 0, 0);
      }
   }
</script>
<body>
    <img id="test" width="0" height="0" src="https://dl.dropboxusercontent.com/u/4111969/test.png">
    <canvas id="mainCanvas" width="320" height="240" style = "border:1px solid #d3d3d3; margin:0; padding:0"></canvas>
</body>
</html>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

应用旋转时,HTML5 canvas Clip() 在 Chrome 中不起作用 的相关文章

随机推荐

  • 您是否见过 Log4j 中基于 NDC 记录到单独文件的附加程序? [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我们只有极少数客户 少于 50 个 我们希望每个客户都有自己单独的日志文件 所有服务器端日志记录信息都存
  • Log4net不会将日志写入日志文件

    我使用 Log4net 创建了一个简单的场景 但我的日志附加程序似乎不起作用 因为消息没有添加到日志文件中 我将以下内容添加到 web config 文件中
  • 使用openssl解密用java加密的aes-gcm

    我有以下 Java 代码 public static void deriveKeyAndIV String password throws Exception SecureRandom random new SecureRandom if
  • 使用 C# 将事件导出为 iCalendar 和 vCalendar 格式

    我正在开发一个项目 我们将支持将事件导出到 Outlook 2007 Outlook 2010 和 iCal 的功能 我做了一些研究 发现 iCal 支持 iCal 程序 和 vCal 支持 Outlook 基本上是同一件事 据我所知 看起
  • LocationManager 与 FusedLocationProvider

    目前我们使用 LocationManager 每隔几秒获取一次 GPS 更新 我们用它来进行高精度更新 此外 我们还希望每 5 分钟获取一次位置坐标 无论 GPS 状态如何 打开 关闭 在这种情况下我们确实忽略了位置的准确性 我们希望使用
  • C++ 中的随机数生成...第一个数字不是很随机

    我试图在 C 中获得 0 到 1 之间的统一随机数 而不使用 boost 我不想依赖图书馆 每当我开始我的计划时 我都会种子 srand 时间 NULL 然后我打印 8 个随机数 我用空行分隔程序的不同运行 Random number 0
  • 在 Node.js 中,setTimeout() 会阻止事件循环吗?

    如果我有一个简单的 setTimeout 函数 并将其设置为 10 秒 整个服务器在那10秒内就死机了 这是真的 这就是我听到的 答案是no 你的链接是什么Node js 如何重新创建 setTimeout 函数而不阻塞事件循环 https
  • 暂存内部文件 csv.gz 给出文件与相应表的大小不匹配的错误?

    我正在尝试将 csv gz 文件复制到我创建的表中 以开始分析地图的位置数据 我遇到了一个错误 提示字符太多 我应该添加一个 on error 选项 不过 我不确定这是否有助于加载数据 你能看一下吗 数据源 https data world
  • 打印 2D ArrayList 矩阵的值

    我有一个 2D Arraylist 矩阵 例如 ArrayList table new ArrayList 10 10 table 0 0 new ArrayList table 0 1 add 10 table 1 0 add 20 ta
  • 启动过程中的写入进度 - 等待

    我正在尝试创建安装脚本并在安装过程中显示进度条 localfolder Get Location path start process FilePath localfolder Installer exe ArgumentList sile
  • 如何计算排列? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我有一个关于 Java 排列的问题 Suppose I have five different elements in an arra
  • 使用 ClosedXML 创建数据透视表

    我正在尝试使用 ClosedXML V0 91 1 创建数据透视表 但我不断遇到问题 因为我的 Excel 文件包含不可读的内容 然后 Excel 工作簿在单击时删除了我的数据透视表Yes below 下面是我击中时的显示Yes 它正在删除
  • 如何在验收测试期间从 Struts 2 获取 ActionContext?

    我正在使用 cucumber jvm 在一个使用 Struts 2 和 Tomcat 作为我的 Servlet 容器的应用程序上编写验收测试 测试行为 在我的代码中的某个时刻 我需要从 Struts 2 中获取用户HttpSession 由
  • 了解新的 mongo id 并将其与 Iron-router 一起使用

    我有一个简单的帖子路线来寻找帖子 id 问题是pathFor助手创建这样的路径 ObjectID 52e16453431fc2fba4b6d6a8 我猜 mongoDB 插入已更改 现在 id对象在其内部包含另一个对象 称为 str 这是我
  • 我可以在 IIS 中禁用大量更改通知吗

    我偶尔会收到以下导致应用程序池被回收的事件 shutDownMessage CONFIG change HostingEnvironment initiated shutdown Overwhelming Change Notificati
  • Qt 安装程序框架 - 如何在卸载时仅删除某些文件和文件夹

    我使用 Qt 安装程序框架 如何确保在卸载时仅删除某些文件或文件夹 而不是像当前那样删除安装文件夹中的所有文件 先感谢您 您可以覆盖默认行为component createOperations对于卸载程序 然后使用手动指定每个卸载路径com
  • 如何快速更改按钮图像?

    我正在开发一个有按钮的应用程序 该按钮没有文本 图像或背景 所以我想做的就是在viewDidLoad函数中给它一个图像 这就是我所拥有的 IBOutlet var tapButton UIButton override func viewD
  • 使用超类初始化器初始化类

    我有两个类 一个是另一个的子类 比如说Animal and Dog 超类有一些初始化器 比如initAnimal 子类有一些初始化器 比如initDog 问题是 从编译器的角度来看 做类似的事情是完全合法的Dog adog Dog allo
  • 无法通过 python3 启动 Selenium Safari WebDriver

    我想使用 Safari 作为 python 的浏览器 代码相当简单 from selenium import webdriver driver webdriver Safari url https www gmail com driver
  • 应用旋转时,HTML5 canvas Clip() 在 Chrome 中不起作用

    我试图在画布上使用剪辑区域 一旦坐标系旋转任何非零值 它就会停止工作 window onload function var canvas document getElementById mainCanvas var ctx canvas g