通过 Javascript 更改图像颜色

2023-11-26

我一直在寻找在使用单击事件时更改图像的颜色。

我偶然发现了这篇文章,其中对马克杯的第一个也是主要的回应效果非常好。

但是,我需要使用类,而不是 ID,因为我需要更改多个图像的颜色。当我将代码更改为 getElementsByClassName 而不是 byID 时,它不再起作用。

我当然将 ID=mug 更改为 class=mug。

我在代码中看不到任何其他地方会导致问题,因此任何帮助将不胜感激。

我无法在原件上发布,所以在这里添加。原文链接是:如何使用jquery改变图像的颜色

这是代码:

<img src="mug.png" id="mug" width="25%" height="25%" onload="getPixels(this)" />
<input type="text" id="color" value="#6491ee" />
<input type="button" value="change color" onclick="changeColor()">

<script type="text/javascript">
    var mug = document.getElementById("mug");
    var canvas = document.createElement("canvas");
    var ctx = canvas.getContext("2d");
    var originalPixels = null;
    var currentPixels = null;

    function HexToRGB(Hex)
    {
        var Long = parseInt(Hex.replace(/^#/, ""), 16);
        return {
            R: (Long >>> 16) & 0xff,
            G: (Long >>> 8) & 0xff,
            B: Long & 0xff
        };
    }

    function changeColor()
    {
        if(!originalPixels) return; // Check if image has loaded
        var newColor = HexToRGB(document.getElementById("color").value);

        for(var I = 0, L = originalPixels.data.length; I < L; I += 4)
        {
            if(currentPixels.data[I + 3] > 0)
            {
                currentPixels.data[I] = originalPixels.data[I] / 255 * newColor.R;
                currentPixels.data[I + 1] = originalPixels.data[I + 1] / 255 * newColor.G;
                currentPixels.data[I + 2] = originalPixels.data[I + 2] / 255 * newColor.B;
            }
        }

        ctx.putImageData(currentPixels, 0, 0);
        mug.src = canvas.toDataURL("image/png");
    }

    function getPixels(img)
    {
        canvas.width = img.width;
        canvas.height = img.height;

        ctx.drawImage(img, 0, 0, img.naturalWidth, img.naturalHeight, 0, 0, img.width, img.height);
        originalPixels = ctx.getImageData(0, 0, img.width, img.height);
        currentPixels = ctx.getImageData(0, 0, img.width, img.height);

        img.onload = null;
    }
</script>

Thanks


我认为这可能与浏览器支持有关,因为document.getElementByClassName("mug");应该返回一个元素数组(旧版浏览器可能不支持它)。此时很容易迭代每个杯子并改变颜色,如下所示

<img src="mug.png" id="mug" width="25%" height="25%" onload="getPixels(this)" />
<input type="text" id="color" value="#6491ee" />
<input type="button" value="change color" onclick="changeMugsColor()">

<script type="text/javascript">
    var mug = document.getElementsByClassName("mug");
    var canvas = document.createElement("canvas");
    var ctx = canvas.getContext("2d");
    var originalPixels = null;
    var currentPixels = null;

    function HexToRGB(Hex)
    {
        var Long = parseInt(Hex.replace(/^#/, ""), 16);
        return {
            R: (Long >>> 16) & 0xff,
            G: (Long >>> 8) & 0xff,
            B: Long & 0xff
        };
    }

    function changeMugsColor() {
        for (var ii = 0; ii < mug.length; ii++) {
            changeColor(mug[ii]);
        }
    }

    function changeColor(amug)
    {
        if(!originalPixels) return; // Check if image has loaded
        var newColor = HexToRGB(document.getElementById("color").value);

        for(var I = 0, L = originalPixels.data.length; I < L; I += 4)
        {
            if(currentPixels.data[I + 3] > 0)
            {
                currentPixels.data[I] = originalPixels.data[I] / 255 * newColor.R;
                currentPixels.data[I + 1] = originalPixels.data[I + 1] / 255 * newColor.G;
                currentPixels.data[I + 2] = originalPixels.data[I + 2] / 255 * newColor.B;
            }
        }

        ctx.putImageData(currentPixels, 0, 0);
        amug.src = canvas.toDataURL("image/png");
    }

    function getPixels(img)
    {
        canvas.width = img.width;
        canvas.height = img.height;

        ctx.drawImage(img, 0, 0, img.naturalWidth, img.naturalHeight, 0, 0, img.width, img.height);
        originalPixels = ctx.getImageData(0, 0, img.width, img.height);
        currentPixels = ctx.getImageData(0, 0, img.width, img.height);

        img.onload = null;
    }
</script>

我还没有运行代码,但它应该可以工作

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

通过 Javascript 更改图像颜色 的相关文章

  • Web 串行 API - 未捕获(承诺中)DOMException:无法打开串行端口/所需成员 baudRate 未定义

    下面的代码可以在我的 Xubuntu 机器上运行 但现在我在 Kubuntu 上 它不再工作了 它不会打开端口 Arduino IDE 工作正常 可以向开发板写入代码 并且我可以在 Chrome 中选择设备 Arduino Uno 但当我尝
  • 在 Vue.js 中从父组件执行子方法

    目前 我有一个 Vue js 组件 其中包含其他组件的列表 我知道使用 vue 的常见方式是将数据传递给孩子 并从孩子向父母发出事件 但是 在这种情况下 我想在子组件中的按钮出现时执行子组件中的方法 parent被点击 哪种方法最好 一种建
  • jQuery AJAX 调用 Java 方法

    使用 jQuery AJAX 我们可以调用特定的 JAVA 方法 例如从 Action 类 该 Java 方法返回的数据将用于填充一些 HTML 代码 请告诉我是否可以使用 jQuery 轻松完成此操作 就像在 DWR 中一样 此外 对于
  • 使用 jQuery/JS 打开时使
    标签的内容具有动画效果

    我只想要 HTML5 的内容details标记为 滑行 动画打开 而不是仅仅弹出打开 立即出现 这可以用 jQuery Javascript 实现吗 Fiddle http jsfiddle net 9h4Hq HTML
  • 检查 JavaScript 字符串是否为 URL

    JavaScript 有没有办法检查字符串是否是 URL 正则表达式被排除在外 因为 URL 很可能是这样写的stackoverflow 也就是说它可能没有 com www or http 如果你想检查一个字符串是否是有效的 HTTP UR
  • 在 Wordpress 站点中进行 AJAX 调用时出现问题

    我在使用 Wordpress 站点功能的 AJAX 部分时遇到了一些问题 该功能接受在表单上输入的邮政编码 使用 PHP 函数来查找邮政编码是否引用特定位置并返回到该位置的永久链接 我的第一个问题是关于我构建的表单 现在我的表单操作是空白的
  • Google App Engine:修改云运行环境

    我正在尝试部署一个使用自定义 Node js 服务器的 Next js 应用程序 我想将自定义构建变量注入应用程序 next config js const NODE ENV process env NODE ENV const envTy
  • Javascript正则表达式用于字母字符和空格? [关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我需要一个
  • 音频 blob 的 URL.createObjectURL 在 Firefox 中给出 TypeError

    我正在尝试从创建的音频 blob 创建对象 URLgetUserMedia 该代码在 Chrome 中可以运行 但在 Firefox 中存在问题 错误 当我打电话时stopAudioRecorder 它停在audio player src
  • 使用 KnockoutJs 映射插件进行递归模板化

    我正在尝试使用以下方法在树上进行递归模板化ko映射 插入 http knockoutjs com documentation plugins mapping html 但我无法渲染它 除非我定义separate每个级别的模板 在以下情况下
  • MVC 在布局代码之前执行视图代码并破坏我的脚本顺序

    我正在尝试将所有 javascript 包含内容移至页面底部 我正在将 MVC 与 Razor 一起使用 我编写了一个辅助方法来注册脚本 它按注册顺序保留脚本 并排除重复的内容 Html RegisterScript scripts som
  • 跟踪用户何时点击浏览器上的后退按钮

    是否可以检测用户何时单击浏览器的后退按钮 我有一个 Ajax 应用程序 如果我可以检测到用户何时单击后退按钮 我可以显示适当的数据 任何使用 PHP JavaScript 的解决方案都是优选的 任何语言的解决方案都可以 只需要我可以翻译成
  • 在javascript中解析json - 长数字被四舍五入

    我需要解析一个包含长数字的 json 在 java servlet 中生成 问题是长数字被四舍五入 当执行这段代码时 var s x 6855337641038665531 var obj JSON parse s alert obj x
  • 如何在react-native中获取Text组件的onPress值

    我是一名新的 React Native 开发人员 我想使用 onPress 获取 Text 组件的值并将其传递给函数
  • Electron - 为什么在关闭事件时将 BrowserWindow 实例设置为 null

    The 电子文档 https electronjs org docs api browser window 提供以下代码示例来创建新窗口 const BrowserWindow require electron let win new Br
  • 为 illustrator 导出脚本以保存为 web jpg

    任何人都可以帮我为 illustrator CC2017 编写一个脚本 将文件以 JPG 格式导出到网络 旧版 然后保存文件并关闭 我有 700 个文件 每个文件有 2 个画板 单击 文件 gt 导出 gt 另存为 Web 旧版 然后右键文
  • HTML 离线应用程序缓存,列出下载的文件

    作为我正在构建的离线 Web 应用程序的加载屏幕的一部分 使用缓存清单 http developer apple com library safari documentation iPhone Conceptual SafariJSData
  • Javascript转换时区问题

    我在转换当前时区的日期时间时遇到问题 我从服务器收到此日期字符串 格式为 2015 10 09T08 00 00 这是中部时间 但是当我使用 GMT 5 中的 new Date strDate 转换此日期时间时 它返回给我的信息如下 这是不
  • Safari 支持 JavaScript window.onerror 吗?

    我有一个附加到 window onerror 的函数 window onerror function errorMsg url line window alert asdf 这在 firefox chrome 和 IE 中工作正常 但在 s
  • JQuery 图像上传不适用于未来的活动

    我希望我的用户可以通过帖子上传图像 因此 每个回复表单都有一个上传表单 用户可以通过单击上传按钮上传图像 然后单击提交来提交帖子 现在我的上传表单可以上传第一个回复的图像 但第二个回复的上传不起作用 我的提交过程 Ajax 在 php 提交

随机推荐

  • C# ListView 项目图像

    如何使用 foreach 语句将图像 指定图像 添加到 listview 中 例如 foreach Video entry in videoFeed Entries listview1 items add entry listview1 i
  • Sprite Kit 中可重用的多线程实现

    我正在开发 Sprite Kit 游戏 我需要做一些多线程来保持健康的 fps 更新时 我调用一个函数来创建大量 UIBezierPaths 并使用 C 静态库合并它们 如果我有超过 10 个形状 帧速率会急剧下降 因此我决定尝试一下 GC
  • 更好的地图构造器

    有没有更简化的方法来执行以下操作 Map
  • 我在哪里可以了解经过验证的共享加密密钥的方法?

    假设一个群组想要加密一些信息 然后以需要群组共识的方式在群组成员之间共享加密密钥来解密该信息 我对各种场景感兴趣 其中共识的广度范围从一致到绝对多数 有用的技术可以应用于对称密钥 私钥或两者 我可以尝试推出自己的方法 我相信许多 SO 成员
  • KCFinder '您无权列出文件。'

    我在 ckeditor 中集成 KCFinder 时遇到问题 我的ckeditor版本是4 0 另一个 KCFinder版本 是2 52 dev 您好 像这样配置 ckeditor 的 config js CKEDITOR config b
  • 如何在Shapely中获得线上等距点

    我试图 大致 将一条线的点均匀地间隔到预定义的距离 距离之间有一定的公差是可以的 但最好尽可能接近 我知道我可以手动迭代线路中的每个点并检查 p1 与 p2 的距离 并根据需要添加更多点 但我想知道是否有人知道是否有办法用 shapely
  • 如何更改 matlab 颜色条缩放比例

    我很难理解如何更改 Matlab 2015b 中颜色条的范围 默认情况下 它的范围从 0 到 1 我设法使用以下方法更改标签 c colorbar c Limits 0 180 the range that I want 问题是当我这样做时
  • 在 CSS/SVG 中是否有一种普遍支持的方法来制作倾斜的“磨砂玻璃”效果?

    我正在寻找制作一个网站醒目页面 该页面将有一个背景 该背景将在左侧被一个倾斜的 div 截断 例如与水平方向保持 110 度 或同等程度 继续阅读 该 div 会模糊其背后的背景 并允许在其上放置内容 例如文本 请参阅YouTube 品牌资
  • OSGI OBR 存储库托管?

    有谁知道有哪些服务可以提供 OBR 来托管我自己的捆绑包 类似于 github 但用于捆绑包 如果没有 有人创建过自己的 OBR 服务器吗 这有多难 编辑 我找到了一个解决方案Nexus Pro 但对于凡人来说似乎太贵了 因为专业版的价格无
  • 在 javascript 中加密并使用 AES 算法在 C# 中解密

    我尝试使用 AES 库进行角度加密AES 我使用以下方法加密了字符串CryptoJS AES encrypt AES 方法 这是我的代码 var txtloginKod Some String var key CryptoJS enc Ut
  • GCC 无法使用 init-capture 捕获指向模板类型的“this”指针

    模板类可以捕获自己的thislambda 中的指针 template
  • 如何获取 Git 中 master 分支的默认值?

    由于简短 GitHub 建议使用main代替master对于默认分支 我们怎样才能得到这个名字 因为编写有弹性的 Git 别名 如何获取 Git 中 master 分支的默认值 我已经搜索过 但没有任何解决方案git 如何获取默认分支 对我
  • 如何实现 getline() 的超时? [复制]

    这个问题在这里已经有答案了 我想从命令行读取一个字符串getline 在c 中 为此我想添加一个计时器5秒 如果没有读取到字符串 则程序将终止 我怎样才能做到这一点 好的 等等5秒 和terminate如果没有输入 include
  • 为什么浏览器不会因语法错误抛出异常?

    我不小心写了一个错误的 JavaScript 语法 我是这么认为的 code is var temp temp a 34 height 34 should fail here temp b 56 jsfiddle 语法是否正确 Thanks
  • 如何修复 PHP 中的“标头已发送”错误

    这个问题的答案是社区努力 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 运行我的脚本时 我收到几个如下错误 警告 无法修改标头信息 标头已由 输出从 some file php 12 开始 in 一些 文件 php on line
  • 有没有一种方法可以让我在标签内使用 Spans 并使其合理?

    我正在使用此代码向标签内的文本添加一些颜色
  • 计算 Pi Java 程序

    我正在参加我的第一堂 Java 编程课程 这是我的第一个课程项目 我对如何处理它感到很困惑 任何帮助或纠正将不胜感激 您可以使用以下级数来近似常数 PI 的值 PI 4 1 1 3 1 5 1 7 1 9 1 11 1 i 1 2i 1 提
  • 使用 IntelliJ IDEA 调试 Spring WebFlux / Reactor 应用程序

    我正在使用 IntelliJ IDEA 创建 Spring WebFlux Reactor 应用程序 IDEA的调试器显示了许多无用的行 例如MonoDefer MonoFlatMap等 有没有办法轻松跟踪堆栈 不幸的是 在异步世界中 堆栈
  • Android——如何从应用程序内向市场发布应用程序评级/评论?

    这是一个简单的问题 有没有办法允许用户直接在我的应用程序中输入对我的应用程序的评论和 或评级 并将该数据发布回 Android Market 如果是这样 如果我使用 EditText 视图来允许用户输入 那么代码会是什么样子 如果不是 那么
  • 通过 Javascript 更改图像颜色

    我一直在寻找在使用单击事件时更改图像的颜色 我偶然发现了这篇文章 其中对马克杯的第一个也是主要的回应效果非常好 但是 我需要使用类 而不是 ID 因为我需要更改多个图像的颜色 当我将代码更改为 getElementsByClassName