Canvas:遮盖图像并保留其 Alpha 通道?

2023-11-21

这就是我想做的:

  1. 获取图像 A 和图像 B。图像 B 是黑白掩模图像。
  2. 将图像 A 的 Alpha 通道替换为图像 B 的红色通道。
  3. 在画布上绘制图像 C。
  4. 在图像 C 上绘制图像 A。

在步骤 4 之前,一切似乎都正常。图像 C 根本不可见,而图像 A 应该是透明的,但其中有白色。

cx.putImageData(imageA, 0, 0);
var resultData = cx.getImageData(0, 0, view.width, view.height);

for (var h=0; h<resultData.data.length; h+=4) {
    resultData.data[h+3] = imageB.data[h];
}

cx.putImageData(imageC, 0, 0);
cx.putImageData(resultData, 0, 0);

西蒙是对的:putImageData方法不关注合成;它只是复制像素值。为了实现合成,我们需要使用绘图操作。

我们需要用像素数据打乱通道(将红色变为 Alpha),将更改后的像素数据放入图像中,然后then使用复合操作来获得所需的掩蔽。

Kinda lame

//copy from one channel to another
var assignChannel = function(imageData, channelTo, channelFrom) {
  if(channelTo < 0 || channelTo > 3 || channelFrom < 0 || channelFrom > 3) {
    throw new Error("bad channel number");
  }
  if(channelTo == channelFrom)
    return;
  var px = imageData.data;
  for(var i = 0; i < px.length; i += 4) {
    px[i + channelTo] = px[i + channelFrom];
  }
};
/**============================================================================ 
  * this function uses 3 or 4 canvases for clarity / pedagogical reasons:
  * redCanvas has our mask image;
  * maskCanvas will be used to store the alpha channel conversion of redCanvas' image;
  * imageCanvas contains the image to be masked;
  * ctx is the context of the canvas to which the masked image will be drawn.
============================================================================**/
var drawOnTopOfRed = function(redCanvas, maskCanvas, imageCanvas, ctx) {
  var redImageData = redCanvas.getContext("2d").getImageData(0, 0, w, h);

  //assign the alpha channel
  assignChannel(redImageData, 3, 0);

  //write the mask image
  maskCanvas.getContext("2d").putImageData(redImageData, 0, 0);

  ctx.save();

  //draw the mask
  ctx.globalCompositeOperation = "copy";
  ctx.drawImage(maskCanvas, 0, 0);

  //draw the image to be masked, but only where both it
  //and the mask are opaque; see http://www.whatwg.org/specs/web-apps/current-work/multipage/the-canvas-element.html#compositing for details.
  ctx.globalCompositeOperation = "source-in";
  ctx.drawImage(imageCanvas, 0, 0);
  ctx.restore();
};

jsfiddle 示例

带有示例的涂鸦:

Kinda lame about the same

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

Canvas:遮盖图像并保留其 Alpha 通道? 的相关文章

  • 如何使用 jQuery 将各种元素包装在 div 标签中?

    我有一个 html 结构 如下所示 h5 Title h5 p Content p ul li Item li li Item li ul p Content p h5 Title h5 p Content p ul li Item li
  • 如何从画布中删除路径区域(Android)

    我需要裁剪角落ImageView 不要将它们弄圆 而是擦除每个角上的三角形 似乎唯一的方法就是覆盖onDraw方法并使用从画布上删除这些区域Path 问题是我没有纯色背景 所以我需要擦除这些区域 但不要用某种颜色填充它们 我为此使用以下代码
  • Django 未在 404 页面上应用应用程序中的 CSS 文件

    姜戈3 0 8 Python 3 7 x 我有一个包含一些应用程序的 Django 项目 我正在尝试为 400 403 404 500 错误制作一些 默认 错误页面 我已经这样做了 并显示了适当的模板 但没有任何样式或 JS 在 404 错
  • 在java中将DataURL图像转换为图像文件

    我在我的 java servlet 中接收图像 DataURL 它看起来像 data image jpeg base64 9j 4AAQSkZJRgABAQAAAQABAA 我需要将其另存为图像文件 我该怎么做 The simplest w
  • Vue 多个组件位于一个包/文件中

    假设我想创建一个 UI 包 如何将多个组件放入一个 JS 文件中 通常我会将不同的组件放在不同的文件中 import ButtonText from ButtonText vue import ButtonIcon from ButtonI
  • 如何在 joomla 模块中通过 javascript 发送输入文件类型

    我想将带有 javascript 的文件发送到 php 文件 我的 php 文件中有这个表单
  • 将压缩的json数据存储在本地存储中

    我想将 JSON 数据存储在本地存储中 有时存储的数据可能超过 5MB 每个域的浏览器允许的最大阈值 无论如何 我可以压缩或压缩数据并将其存储在本地存储中吗 如果对大数据进行每个 JS 函数的压缩和解压 会增加多少延迟 我正在使用这个 js
  • 是否有 IE 渲染完成事件?

    在尝试确定页面加载时间为 20 秒的原因时 我发现 IE8 中有一些奇怪的行为 场景是这样的 我进行 ajax 调用 它返回并且回调看起来像这样 StoreDetailsContainer html tableHtml var StoreD
  • 适用于 HTML5 混合应用程序的 CORS

    我读过很多关于 CORS 的文章 以及允许 Access Control Allow Origin 如何成为 Web 服务器的安全漏洞 但没有一篇文章解释了如何允许 HTML5 混合应用程序访问某些不允许使用通配符 的域上托管的 Web 服
  • 如何使用 JavaScript 禁用滚动条?

    当我仅在 Internet Explorer 7 中显示代表模式窗口的 div 时 我需要锁定浏览器滚动条 谷歌搜索我发现我可以使用document body style overflow hidden 但这不适用于 IE7 我也尝试过do
  • Node.js 连接 createServer 代码

    我正在阅读 Node js Connect 版本 2 15 0 Create a new connect server return Function api public function createServer function ap
  • 带有子节点的拖放区域

    我有一个带有多个子节点的拖放区域 主要元素有dropenter and dropleave事件 但是 如果您将文件拖动到主元素内部和子节点上方 则dropleave被触发 如何处理 以便dropleave仅当拖动的元素和鼠标位于主元素之外时
  • 将 MathJax 脚本添加到 Office 365 Sharepoint 中的页面

    我正在尝试将 Mathjax 库添加到 SharePoint 库 以便我们可以使用 LaTex 语法来添加方程 我在网上搜索时看到了多种方法 但似乎没有一种方法可以与最新版本的 MathJax 和 Office 365 版本的 ShareP
  • 创建响应式眼睛焦点图标

    我一直在尝试制作响应式彩色眼睛焦点图标 但到目前为止我所尝试的一切均不成功 我试图在某种程度上复制真眼的颜色 我使用边框 框阴影来获取颜色 但该部分没有缩放 也尝试过轮廓 但也失败了 那个甚至不是圆的 div 的高度当前是静态的 但我希望它
  • 路由和干净路径(无主题标签)在 angularJS 中不起作用

    伙计们 这让我发疯了 我为此奋斗了几个小时 却找不到解决方案 我知道为了从 URL 路径中清除主题标签 我需要使用 locationProvider html5Mode true 但由于某种原因 这对我来说效果不佳 我使用 tomcat 7
  • QUnit 与固定装置的奇怪行为,测试交替失败和通过

    我在 QUnit 中进行了以下设置 Dozen or so previous tests here test Test some markup generation function qunit fixture plugin jQuery
  • HTML 布局:向现有网站添加侧边栏

    我有一个网站 其正文如下所示 div div div div div div 这些中没有使用绝对 相对定位技巧divs 但是有很多floats clears margins and padding这些风格divs 及其内部元素 所有这些都会
  • 保存 dat.gui 预设以动态添加控件?

    我正在向 dat gui 界面动态添加控件 但 保存设置 功能无法识别它们 var mygui new dat GUI mygui remember mygui standard way of adding a control mygui
  • IE7 问题 - 当禁用文件下载自动提示时无法下载流式文件

    我的应用程序是基于 J2EE JSP Servlet 的 当我尝试从 JSP 打开新窗口 弹出窗口 并调用 Servlet 操作 例如 Streamer do 以在该弹出窗口内传输 PDF 文件时 我遇到了问题 问题 当 IE 7 gt 工
  • 从另一台服务器读取 Node.js 中的大文件

    我有两台相互通信的服务器 Server1 向 Server2 请求文件的部分内容 并将收到的数据存储到一个文件中 Server2 应该接收每个请求并创建一个流管道传输数据 假设服务器2中存储的文件 目录 如下 bigfile gz bigf

随机推荐

  • 如何通过 TypeScript 在 Vue.js 中使用 Provide/Inject

    我将 Vue js 与 TypeScript 一起使用vue 属性装饰器包裹 根据文档 理论上我可以做这样的事情 import Component Inject Provide Vue from vue property decorator
  • javascript 将事件处理程序绑定到水平滚动

    javascript中有没有一种方法可以将事件处理程序绑定到水平滚动 而不是用户水平和垂直滚动时触发的通用滚动事件 我想仅当用户水平滚动时触发事件 我四处寻找这个问题的答案 但似乎找不到任何东西 Thanks 附 如果我错误地使用了一些术语
  • “AnonymousUser”对象没有属性“backend”

    使用 django socialregistration 出现以下错误 AnonymousUser object has no attribute backend How 我点击 Facebook 连接网址 这让我使用 Facebook 并
  • 有条件地调用成员函数而不使用临时变量

    我有一个返回对象的表达式 并且仅当某个布尔条件为 true 时 我才想在结果对象上调用方法 我想在 val 中获取结果 无论是对象 还是调用对象上的方法的结果 一种方法是使用临时变量 如下例所示 其中List 3 1 2 是返回对象的 可能
  • 在渲染 React hooks 之前等待 API 调用数据

    我进行 API 调用 看起来 React 继续构建一个没有数据的表 从而抛出以下错误 Uncaught TypeError Cannot read property map of undefined 这就是我正在做的 useEffect 非
  • 在 UIImageView 上添加渐变

    我正在尝试在我的上添加一个子层UIImageView但它不起作用 我有一组 10 张图像 命名为photo0 to photo9我显示 它有一个5秒的计时器 出口shanghaiImage是我的背景 我想在这个马蒂的顶部添加一个渐变 例如
  • Log4j 通过任何文件附加程序进行每日轮换和每月保留

    是否可以使用任何 log4j 附加程序来写入具有特定轮换时间和保留限制的日志 目标是 每天都有一个日志文件 在午夜创建一个新文件 新日志 保留日志文件并自动删除它们 经过一定时间后 因此删除超过 X 天 例如 30 天 的日志文件 看起来轮
  • 在 MongoDB 集合上为 Web 应用程序创建索引的推荐方法/位置

    我正在将 MongoDB 用于我们的 Web 应用程序 假设 MongoDB 上有一个用于传入请求的 find 在 MongoDB 集合上添加索引的推荐方式 位置是什么 我能想到的几个选择 1 初始化应用程序时集合上的 ensureInde
  • React 中的状态是什么?

    我知道状态允许我们创建动态和交互式的组件 但我想深入了解状态 有人可以帮助我使用现实生活中的例子来理解 React 中的状态吗 import React from react class App extends React Componen
  • 如何修复损坏的 HDFS 文件

    如何修复损坏的 HDFS 我查看了 Apache Hadoop 网站 它说fsck command 这并不能解决问题 希望以前遇到过这个问题的人可以告诉我如何解决这个问题 与本机文件系统的传统 fsck 实用程序不同 此命令不会纠正它检测到
  • 为什么这个 C++0x 代码不调用移动构造函数?

    由于某种原因 以下代码永远不会调用Event Event Event e Event a Event b Event temp temp move a a move b b move temp why not Using std swap调
  • 使用批处理脚本检查环境中是否存在 JAVA_HOME

    我想检查环境中是否存在 JAVA HOME 所以我写了下面的脚本a bat if JAVA HOME echo Enter path to JAVA HOME set p javahome if not JAVA HOME echo JAV
  • 如何实现 SetOnItemClickListener FirebaseRecyclerViewAdapter

    如何在 Firebase RecyclerView 适配器中实现 SetOnItemClickListener 事件 我使用文档聊天应用程序的示例 private FirebaseRecyclerViewAdapter mAdapter R
  • 如何使用 Apache POI XSSF Excel 的 IndexedColors 中没有的颜色?

    我正在查看一个我想要复制的 Excel 工作表 我遇到的唯一问题是颜色 我想要复制的颜色是Blue Accent 5 Lighter 40 and Light Green来自Standard Colors部分 我正在看docs在 XSSF
  • 来自 ElementUI 的 VueJs + Webpack 延迟加载模块

    我想在 Vue 组件中延迟加载 ElementUI 的特定元素 我试过这个 import Tree from webpackChunkName element ui element ui Vue component Tree name Tr
  • 如何在不使用 npm 的情况下安装 Node.js 模块?

    列出了相当多的模块在节点的 github 页面上但未通过 npm registry 发布 这些模块无法使用 npm 安装 从 Git 克隆这些 Nodejs 模块后 安装它们的正确方法是什么 您需要从 github 下载它们的源代码 找到主
  • Java 无法比较的数据类型 char 和 String

    当我运行 Javac 时 它告诉我 我有一个无法比较的数据类型 char 和 String while responseChar y 不确定要更改什么来修复此错误 import java util Scanner public class
  • 如何在 mule 中强制例外[关闭]

    Closed 这个问题需要细节或清晰度 目前不接受答案 我用的是3 2版本 当肥皂故障从服务返回时 我想记录错误并强制全局异常 我尝试使用
  • PHP 动态命名空间

    我需要能够做到这一点 ns common components cfoBi i18n countryCode gimmea use USP 显然这行不通 那么我该怎么做呢 有 动态命名空间 吗 不可能 命名空间 导入和别名在编译时解析 但是
  • Canvas:遮盖图像并保留其 Alpha 通道?

    这就是我想做的 获取图像 A 和图像 B 图像 B 是黑白掩模图像 将图像 A 的 Alpha 通道替换为图像 B 的红色通道 在画布上绘制图像 C 在图像 C 上绘制图像 A 在步骤 4 之前 一切似乎都正常 图像 C 根本不可见 而图像