HTML5 Canvas:更改图像颜色

2024-03-30

我有一个图像(灰度形式),我想更改其颜色(特定于用户)。由于更改灰度图像的颜色非常困难,因此我提出了一种方法。

图像分为两部分。

  1. 一种是白色图像。
  2. 其次,具有灰度的半透明图像。

现在,我将两个图像放在彼此的顶部(白色图像在下面,灰度图像在上面),这样当我更改白色图像的颜色时,用户就可以看到它。

问题:除了一个问题之外,这种方法对我有用。当我给白色图像上色时,它会从角落开始像素化。

JSFiddle:http://jsfiddle.net/pandey_mohit/BeSwL/ http://jsfiddle.net/pandey_mohit/BeSwL/

JSFiddle 包含三个胶囊图像:

  1. 顶部胶囊部分白色图像(用于着色)
  2. 底部胶囊部分白色图像(用于着色)
  3. 用于 3D 效果的半透明图像(使用灰度)

选择红色、绿色或蓝色来查看问题。

function hexToRgb(color) {
    var shorthandRegex = /^#?([a-f\d])([a-f\d])([a-f\d])$/i;
    color = color.replace(shorthandRegex, function(m, r, g, b) {
        return r + r + g + g + b + b;
    });

    var result = /^#?([a-f\d]{2})([a-f\d]{2})([a-f\d]{2})$/i.exec(color);
    return result ? {
        r: parseInt(result[1], 16),
        g: parseInt(result[2], 16),
        b: parseInt(result[3], 16)
    } : {
        r: 0,
        g: 0,
        b: 0
    };
}

function colorImage(imgId,hexaColor) {
    // create hidden canvas (using image dimensions)
    var imgElement = document.getElementById(imgId);

    var canvas = document.createElement("canvas");
    canvas.width = imgElement.width;
    canvas.height = imgElement.height;

    var ctx = canvas.getContext("2d");
    ctx.drawImage(imgElement,0,0);

    var imageData = ctx.getImageData(0,0,canvas.width,canvas.height);

    var data = imageData.data;

    // convert image to grayscale
    var rgbColor = hexToRgb(hexaColor);

    for(var p = 0, len = data.length; p < len; p+=4) {
        if(data[p+3] == 0)
           continue;
        data[p + 0] = rgbColor.r;
        data[p + 1] = rgbColor.g;
        data[p + 2] = rgbColor.b;
        data[p + 3] = 255;
    }
    ctx.putImageData(imageData, 0, 0);

    // replace image source with canvas data
    imgElement.src = canvas.toDataURL();
}

// changing color of capsule on select event
document.getElementById('sel_top').onchange = function(){
    colorImage('img_top', this.value);
}
document.getElementById('sel_bottom').onchange = function(){
    colorImage('img_bottom', this.value);
}

您的重新着色算法将每个 RGBA 四重奏的第 4 个字节设置为 255,这会丢弃叠加层的 Alpha 通道并破坏图像边缘周围的抗锯齿功能。保留原始的 Alpha 通道可以给你带来更好的结果:

for(var p = 0, len = data.length; p < len; p+=4) {
    data[p + 0] = rgbColor.r;
    data[p + 1] = rgbColor.g;
    data[p + 2] = rgbColor.b;
}

JSFiddle 中的行已被注释掉 http://jsfiddle.net/gwF6h/

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

HTML5 Canvas:更改图像颜色 的相关文章

  • 防止 iOS 键盘在 cordova 3.5 中滚动页面

    我正在使用 Cordova 3 5 和 jQuery mobile 构建 iOS 应用程序 我在大部分应用程序中禁用了滚动功能 但是 当我选择输入字段时 iOS 键盘会打开并向上滚动页面 我不想要这个功能 由于输入足够高 键盘不会覆盖它 我
  • 将 GMT 时间转换为当地时间

    我以这种格式从我的服务器获取 GMT 时间 Fri 18 Oct 2013 11 38 23 GMT 我的要求是使用Javascript将此时间转换为本地时间 例如 如果用户来自印度 首先我需要采用时区 5 30并将其添加到我的服务器时间并
  • 设置 cookie 时中断 JavaScript 执行

    当设置 cookie 时 是否可以始终中断浏览器开发人员工具中的 javascript 执行 无需显式设置 JS 断点 document cookie 在 html head 块的开头添加此代码片段效果很好
  • php - 解析html页面

    div divbox div p para1 p p para2 p p para3 p table class table tr td td tr table p para4 p p para5 p 有人可以告诉我如何解析这个 html
  • Chrome 扩展程序在代码中使用 client_secret

    我正在开发具有自己的 oAuth 授权的 Google Chrome 扩展 当然 我必须使用 client id 和 client secret 作为请求令牌 有什么办法可以向用户隐藏这些数据吗 由于此请求只是 javascript 源代码
  • 使用 CSS 使一行 div 高度相同

    我有一排必须具有相同高度的 div 但我无法提前知道该高度可能是多少 内容来自外部源 我最初尝试将 div 放置在封闭的 div 中并将它们向左浮动 然后我将它们的高度设置为 100 但这没有明显的效果 通过将封闭 div 的高度设置为固定
  • 使用 CSS 或 Javascript 填充动画

    我只是想知道是否可以使用 CSS 或 javascript 创建填充动画 基本上我想创建一个填充动画 如下图所示 http i40 tinypic com eit6ia png http i40 tinypic com eit6ia png
  • 为什么我们在打字稿中使用 HTMLInputElement ?

    我们为什么使用 document getElementById ipv as HTMLInputElement value 代替 document getElementById ipv value 功能getElementById返回具有类
  • 将 UMD Javascript 模块导入浏览器

    你好 我正在对 RxJS 进行一些研究 我可以通过在浏览器中引用它来使用该库 如下所示 它使用全局对象命名空间变量 Rx 导入 我可以制作可观察的东西并做所有有趣的事情 当我将 src 更改为指向最新的 UMD 文件时 一切都会崩溃 如下所
  • 不可勾选的单选按钮与专有的复选框

    从 UI 角度来看 是拥有一组具有取消选中功能的单选按钮更好 还是拥有一组独占的复选框 意味着一次只能选中一个 更好 Update 我没想到对此会有如此负面的反应 如果我给出一个更接近其使用方式的示例 也许会有所帮助 我有一个充满数据绑定内
  • 页面上使用 HTML Editor Extender 进行回发会导致 IE11 中出现 JavaScript 错误

    我已将 HTML 编辑器扩展程序添加到我正在处理的页面中 现在每当我在页面上发回帖子时 都会收到以下 Javascript 错误 JavaScript 运行时错误 参数无效 之后什么也没有发生 这在 IE10 或更低版本以及我所知道的所有其
  • 图像背景不透明度不影响边框

    如何设置背景不透明度而不影响边框线不透明度 我找到的解决方案没有帮助 div class selected img src assets img image product 1 thumbnail jpg alt product 1 thu
  • Vuejs 2:去抖动不适用于手表选项

    当我在 VueJs 中反跳此函数时 如果我提供毫秒数作为原语 它就可以正常工作 但是 如果我将其提供为对 prop 的引用 它会忽略它 这是道具的缩写版本 props debounce type Number default 500 这是不
  • Javascript 假值(null、未定义、false、空字符串:“”或 '' 和 0)和比较(==)运算符 [重复]

    这个问题在这里已经有答案了 当我使用任何一个值时 null undefined false 0 in a if陈述 它总是被评估为谬误 false 另外 这些值的否定 null undefined false 0 in a if语句总是被评
  • Firebase 函数 onWrite 未被调用

    我正在尝试使用 Firebase 函数实现一个触发器 该触发器会复制数据库中的一些数据 我想观看所有添加的内容votes user vote 结构为 我尝试的代码是 const functions require firebase func
  • 在移动设备上滚动

    这个问题更多的是一个建议研究 我确实希望它对其他人有帮助 并且它不会关闭 因为我不太确定在哪里寻求有关此事的建议 在过去的 6 个月里 我一直在进行移动开发 我有机会处理各种设备上的各种情况和错误 最麻烦的是滚动问题 当涉及到在网站的多个区
  • 日期出现奇怪的错误,“未捕获非法访问”

    所以我试图找到最新的DateJavascript 可以处理 我把它减少到 9 月 275760 并增加了我开始捕获未捕获的天数illegal access例外new Date 09 24 275760 to new Date 10 13 2
  • 代码镜像错误:未捕获错误:扩展集中无法识别扩展值([对象对象])

    全部 我目前正在从事一个React Electron项目 该项目的目标是完成一个Markdown编辑器 当我配置codemirror 该程序报告错误说 Uncaught Error Unrecognized extension value
  • CSS溢出文本显示在几行中,没有断字

    我有一些长文本显示在 div 中 该 div 具有固定的宽度和高度 我希望文本显示在几行上 作为 div 高度 并且句子单词不会中断 一行中的单词前缀和下一行中的继续 此外 我想在末尾添加省略号最后一句话 CSS white space n
  • 在 Nexus 7 2013 上更改方向时 CSS 媒体查询不起作用

    我目前正在我的笔记本电脑 台式电脑和 Nexus 7 2013 上测试 CSS 媒体查询 除了 Nexus 7 之外 它们在台式机和笔记本电脑上都运行良好 当我更改方向时 除非刷新页面 否则样式不会应用 例如 以纵向模式握住设备时 页面正常

随机推荐

  • perl 从文件中删除行

    我的文件看起来像 ATOM 2517 O VAL 160 8 337 12 679 2 487 ATOM 2518 OXT VAL 160 7 646 12 461 0 386 TER ATOM 2519 N VAL 161 14 431
  • InversifyJS @multiInject 不起作用,抛出错误“发现 serviceIdentifier 不明确匹配”

    我在我的打字稿项目中使用 inversifyJs 进行 DI 使用装饰器 multiInject 时 我收到错误 发现 serviceIdentifier 不明确匹配 我正在遵循这个例子 https github com inversify
  • 如何关闭 Sublime Text 2 中某些文件的删除空格功能?

    我有一个选择trim trailing white space on save打开 对于某些文件 我应该防止删除尾随空格 因为它们很重要 如何删除某些文件的此行为 例如 dat 您是否已尝试为该特定扩展创建配置文件并放置trim trail
  • 如何链接到页面并使用 Rails 激活特定选项卡

    如果信息页面具有基于不同主题的多个选项卡 并且存在从不同页面通向信息页面的链接 那么如何根据所使用的链接链接到具有活动选项卡的信息页面 我想要一个像这样的链接 p View the terms conditions on our info
  • 将季度数据框转换为每月数据框并填充 Pandas 中的缺失值

    对于这样的季度数据框 date gdp rate 0 2003 3 1 523 82 0 1 1 2003 6 1 1172 83 0 2 2 2003 9 1 1882 48 0 4 3 2003 12 1 3585 72 0 1 4 2
  • 如何将即时时间转换为本地时间?

    即使阅读了大量教程后 我也不太了解 TemporalAdjusters 或 Java 的新时间库 我怎样才能转换Instant反对LocalTime目的 我正在思考以下内容 LocalTime time LocalTime of insta
  • Eclipse Hibernate.cfg.xml 正在从 MySQL 链接“sys”数据库

    当我使用 Hibernate 连接 MySQL 数据库时 书库数据库 在 Eclipse 中 连接到 MySQLsys数据库也显示出来了 我正在使用以下内容 Ubuntu 18 04 5 LTS 桌面 Eclipse 2020 6 4 16
  • Java Http 客户端通过 POST 上传文件

    我正在开发一个 J2ME 客户端 它必须使用 HTTP 将文件上传到 Servlet servlet 部分使用 Apache Commons FileUpload 进行覆盖 protected void doPost HttpServlet
  • 追加函数不返回追加的对象吗?

    假设this是 dom 中一些现有的块级元素 image is http www google com images srpr nav logo25 png执行以下操作不起作用 this append img attr src image
  • boost::asio 无法完全关闭 TCP 连接

    我正在尝试实现一个简单的 HTTP 服务器 我能够向客户端发送 HTTP 响应 但问题是在 Firefox 上我收到 连接重置 错误 IE 也失败了 而 Chrome 工作正常并显示我在响应中发送的 HTML 如果我远程登录到我的服务器 那
  • 如何从 UI 测试访问我的 swift 类?

    我有一个像这样的 UI 测试 func testHome if isRedOrange clear code 如何从 UI 测试中的 isRedOrange swift 文件访问 isRedOrange clear 函数 UI 测试是黑盒的
  • 隐藏预期输出

    这是期望脚本的一部分 usr bin expect spawn noecho kwalletcli f Passwords e keyofmypassword expect set passwd expect out buffer do s
  • 当我使用 discord.py 使用 ast.literal_eval 时,第 1 行出现格式错误的节点或字符串

    我尝试执行 import ast ast literal eval 5 5 然后我得到了ValueError malformed node or string on line 1
  • 异步并发地播放不同音高的声音

    我的目标是使用 Python 在计算机游戏环境中播放满足以下要求的声音 获取一些输入 WAV 文件并随机将音高改变为原始值的 50 使用 PyDub 更改采样率似乎是一种简单的方法 播放声音 能够快速调用该函数 使实际播放时长短声音重叠 我
  • LR(0)、LL(0)、LALR(1) 等之间的关系?

    我真的很难理解以下之间的关系 LR 0 LL 0 LALR 1 SLR 1 LR 1 LL 1 我很确定 LALR 1 和 SLR 1 是 LR 1 的子集 但我不知道其他的 它们都是独家的吗 LL 0 是 LL 1 的子集吗 Thanks
  • 阻止应用程序通过 Cocoa API (LittleSnitch API) 访问网络?

    我正在使用 OS X 10 5 我正在寻找一种方法来检测应用程序是否尝试访问互联网 此时 如果应用程序与我将定义的一组规则匹配 我想阻止该应用程序 有的是ipfw我意识到可以使用 Unix 命令来阻止对某些端口的访问 但这会影响所有应用程序
  • Ansible add_host 不起作用,它正在跳过主机

    我正在使用 Ansible 创建一个新的 EC2 实例并尝试在其上安装一些软件包 问题是我正在向主机组添加新主机 但我在另一个游戏中看不到该主机组 当到达 配置 EC2 实例 时 它会显示 PLAY 配置EC2实例 跳过 没有匹配的主机 这
  • Python 中的多行日志记录

    我正在使用 Python 3 3 5 和日志记录模块将信息记录到本地文件 来自不同的线程 在某些情况下 我想输出一些附加信息 但不知道这些信息到底是什么 例如 它可能是一行文本或一个字典 我想做的是在写入日志记录后将此附加信息添加到我的日志
  • 远程 Pushurl 不起作用

    我在我的项目中使用 GIT 现在我想将它与github集成 所以我创建了一个远程 git remote add github https email protected cdn cgi l email protection WouterJ
  • HTML5 Canvas:更改图像颜色

    我有一个图像 灰度形式 我想更改其颜色 特定于用户 由于更改灰度图像的颜色非常困难 因此我提出了一种方法 图像分为两部分 一种是白色图像 其次 具有灰度的半透明图像 现在 我将两个图像放在彼此的顶部 白色图像在下面 灰度图像在上面 这样当我