HTML5:通过 JavaScript 绘图后将透明度应用于 Canvas

2024-01-03

我试图将多个对象绘制到画布元素上,然后将它们干净地淡出。然而,当尝试使用 globalAlpha 来实现此目的时,您可以看到通常会被遮挡的对象片段,因为每个对象都变得单独透明。解释:

考虑以下代码:

context.fillStyle="yellow";
context.fillRect(0,0,100,100);
context.fillStyle="blue";
context.fillRect(50,50,100,100);

这将创建一个像这样的图像:

Y = Yellow, B = Blue

Y Y Y Y
Y Y Y Y
Y Y B B B B
Y Y B B B B
    B B B B
    B B B B

根据需要,蓝色框完全覆盖黄色框。然而,当我们开始增加透明度时:

context.globalAlpha=0.5;
context.fillStyle="yellow";
context.fillRect(0,0,100,100);
context.fillStyle="blue";
context.fillRect(50,50,100,100);

我们最终得到这样的结果:

Y = Yellow, B = Blue, M = Mix of both

Y Y Y Y
Y Y Y Y
Y Y M M B B
Y Y M M B B
    B B B B
    B B B B

由于蓝色矩形在绘制时是透明的,因此之前被遮挡的黄色框的角现在可见。那太丑了。

请记住:淡出的画布及其背后的元素都是复杂的、动态的混乱;手动跟踪正在绘制的每个对象以及它们如何重叠会很快失去控制,并且使用纯色叠加来“伪造”淡出同样不是一个可行的解决方案。

虽然我愿意使用 CSS 透明度来实现这一目标(如果这确实是最好的方法的话),但我希望使用画布本身来实现这一目标。我遇到过画布像素操作 https://developer.mozilla.org/en-US/docs/Web/API/Canvas_API/Tutorial/Pixel_manipulation_with_canvas,这可能是一个选择,但我担心我可能会忽略一种更简单、更有效的处理方法。

有任何想法吗?


为了获得淡出当前画布的清晰效果,您可以在完全填充任何颜色时使用“destination-out”操作:这会使画布保持不变...除非您将 globalAlpha 降低到 x,否则生成的 alpha将乘以 1-x。

(http://dev.w3.org/fxtf/compositing-1/#porterduffcompositingoperators_srcout http://dev.w3.org/fxtf/compositing-1/#porterduffcompositingoperators_srcout )

jsbin :

http://jsbin.com/cecavojepa/1/edit?js,输出 http://jsbin.com/cecavojepa/1/edit?js,output

核心衰落函数:

function fadeCanvas() {
  ctx.save();
  ctx.globalAlpha = 0.1;
  ctx.globalCompositeOperation='destination-out';
  ctx.fillStyle= '#FFF';
  ctx.fillRect(0,0,cv.width, cv.height);    
  ctx.restore();   
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTML5:通过 JavaScript 绘图后将透明度应用于 Canvas 的相关文章

随机推荐

  • 重命名文件夹中的所有文件

    我想知道是否可以使用 vb NET 通过一个简单的程序重命名文件夹中的所有文件 我很绿 不确定这是否可能 假设有一个包含文件的文件夹 Text Space aliens txt fishing and hunting racoons txt
  • 在Android中使用geo的默认谷歌地图具有多个经纬度

    我使用以下代码在默认谷歌地图上显示位置geo Uri uri Uri parse geo Global detail lat Global detail long q Global detail lat Global detail long
  • 更改 rich:dataTable 中行的背景颜色

    我在 rich datatable 中有一行 其中的一列中有一个链接 单击此单击时 我需要更改所选行的背景颜色 我怎样才能做到这一点 您可以使用以下代码来执行此操作
  • Python3 - 如何从现有抽象类定义抽象子类?

    我最初定义了以下抽象类 from abc import ABC abstractmethod class Primitive ABC 现在我想创建另一个继承自 Primitive 的抽象类 class InstrumentName Prim
  • Verilog 最佳实践 - 递增变量

    我绝不是 Verilog 专家 我想知道是否有人知道这些增加值的方法中哪一种更好 抱歉 如果这个问题太简单了 Way A 在组合逻辑块中 可能在状态机中 some condition count next count 1 然后在一个连续块中
  • 禁用 Apache Felix 中的缓存

    我正在尝试按照该线程中的说明进行操作 http osdir com ml dev felix apache 2009 05 msg00051 html http osdir com ml dev felix apache 2009 05 m
  • 在 PhoneGap IOS 上缓存图像的最佳方法

    我正在构建一个 PhoneGap ios 应用程序 用于使用 JSON 从服务器导入数据 该数据包含图像 URL 我已经用于将数据缓存在本地存储中 以便在应用程序没有互联网连接时使用它 但我有一个问题是缓存图像的最佳方式是什么 我正在考虑将
  • 在 RStudio 中安装包时出错:从连接读取时出错

    我最近更新了 R 版本 3 4 1 和 RStudio 版本 1 0 143 现在无法从 Rstudio 安装软件包 如果我直接使用 R 安装包install packages 效果很好 如果我尝试使用以下任一方法在 Rstudio 中安装
  • 构造函数调用自身

    我最近发现无参数构造函数和多参数构造函数不能轮流调用对方 这种限制的根本原因是什么 有人可能会说构造函数是初始化资源的地方 因此不能递归调用它们 我想知道这是否是唯一的原因 函数 方法 过程可以递归调用 为什么不是构造函数 答案在于 对另一
  • 获取焦点(或 Tab)顺序

    我使用 Qt Designer 设计了一个用户界面 并使用 编辑选项卡顺序 模式设置了选项卡顺序 现在我想知道 出于其他原因 不是那么重要 是如何获取 ui 中特定 QWidget 的 Tab 键顺序 我的意思是 如果我有几个小部件 并且说
  • 工作流程语言? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找当前工作流程语言的列表 我知道关于BPEL http en wikipedia org wiki Business Proces
  • 查询特定 Twitter 用户的 tweepy (get_followers) 中的分页

    我对使用游标类的 tweepy 和分页相当陌生 我一直在尝试使用光标类来获取特定 Twitter 用户的所有关注者 但我不断收到错误消息 tweepy error TweepError This method does not perfor
  • Apache Tomcat 9 重写阀不工作

    我一直在尝试设置我的 tomcat 9 重写阀门 在全局级别 但没有成功 遵循我在互联网上找到的每个教程 但无论我如何配置我的 rewirte config 阀门根本无法工作 所以我写了我能想到的最简单的 rewrite config 它只
  • Vue 和 Bootstrap Vue - 动态使用插槽

    我试图在 bootstrap vue 表中创建一个插槽 以使用自定义组件呈现任何布尔值 所以我有一个简单的表
  • 自动部分重新索引何时在 Magento EE 1.13 中实际运行?

    Magento 1 13 为大多数索引添加了部分索引 并能够将索引过程推迟到异步运行的 cron 作业 我的问题是 是否有现有的 cron 作业可以执行此操作 或者这是我必须自己设置的东西 文档对此并不清楚 http www magento
  • 如何在 Android 应用程序中单击按钮时打开网站?

    我正在设计一个应用程序 有几个按钮供用户单击 单击按钮后 用户将被定向到适当的网站 我该如何实现这个目标 如果您正在谈论 RCP 应用程序 那么您需要的是 SWTlink widget Here http dev eclipse org v
  • 在 Google 表格中查找默认填充颜色的颜色代码

    我正在编写一个脚本 使用以下命令为 Google 电子表格中的单元格着色Range setBackground color 方法 我想使用一种预设填充颜色 但我很难找到确切的颜色代码 十六进制 RGB 我只想要一个官方列表 000000 4
  • 如何知道应用程序是否首次在 Mac 上运行

    在Windows上 我们可以将值写入注册表来知道 但我如何知道我的应用程序是否是第一次在 Mac 上运行 我需要执行一些初始化任务 Thanks 您正在寻找班级NSUserDefaults see 苹果文档 http developer a
  • 完整的未来 | thenApplyAsync 与 thenCompose 及其用例[重复]

    这个问题在这里已经有答案了 我试图理解 CompletableFuture 并遇到了两种方法 thenApplyAsync 和 thenCompose 我试图理解这两者之间的区别 CompletableFuture
  • HTML5:通过 JavaScript 绘图后将透明度应用于 Canvas

    我试图将多个对象绘制到画布元素上 然后将它们干净地淡出 然而 当尝试使用 globalAlpha 来实现此目的时 您可以看到通常会被遮挡的对象片段 因为每个对象都变得单独透明 解释 考虑以下代码 context fillStyle yell