【问题标题】:How to change color of an image using jquery [closed]如何使用 jquery 更改图像的颜色 [关闭]
【发布时间】:2012-02-16 00:22:08
【问题描述】:

首先我很抱歉我要问这个愚蠢的问题。我有一个杯子的图像。当任何用户从颜色选择器中选择颜色代码时,我想将杯子的颜色变成该颜色。

能否请您给我一个关于如何使用 jquery 执行此操作的提示?我打算使用 PHP 和 Jquery 来实现这一点。

在此先感谢 :)

P.S 我刚刚想到,如果对象是图像格式,则无法使用颜色选择器更改对象的颜色,但仍然必须有一种方法来实现这一点。请你给我一些建议好吗?

【问题讨论】:

  • 你能给我们看看图片文件吗?根据它的复杂性,使用画布可能会取得良好的效果。
  • @Delta 感谢您的回复。我试图上传图片,但 stackoverflow.com 没有让我...说我需要超过 10 名声望。但是我已将图像上传到 tinypic。这是链接i42.tinypic.com/20zz140.jpg :) 再次感谢
  • @Delta。我已经给你链接到我的图像。你认为使用“画布”对我有用吗?因为你会看到我的杯子的颜色是白色的..如果任何用户使用颜色选择器并选择红色,然后改变主意立即选择黄色..杯子的颜色将变成黄色+红色。它不会用黄色代替红色。如果我错了,请纠正我。谢谢:)
  • 哦,是的,它会成功的,我有点忙,我现在正在处理我的答案。在这种情况下,您希望它是红色+黄色还是只是黄色?可以随心所欲地完成。
  • 我只希望它是黄色的,而您已经为我做到了。 :) 谢谢你的时间。 :)

标签: javascript jquery


【解决方案1】:

好的,第一步,您将使用 PNG 代替 jpeg 格式,这样您就可以在图像上设置透明区域。

在图像编辑器中打开它并剪掉图像上的所有空白区域,使杯子具有透明的轮廓。像这样:

我们不会在这里使用 jQuery,因为老实说,我对此一无所知,所以我无法帮助您,而是我们将直接使用 HTML 5 中的 canvas API(这意味着您的应用程序将无法运行在旧浏览器上)

在这里,我们将执行逐像素的颜色乘法,因为您的杯子是灰度的,这将为我们完成。

让我们选择一个包含所有像素颜色信息的数组。

  1. 将图像添加到 DOM
  2. 创建屏幕外画布元素
  3. 等待图片加载
  4. 在画布上绘制图像
  5. 在图像的 onload 事件中使用getImagedata 方法获取像素数据

    var mug = document.getElementById("mug");
    var canvas = document.createElement("canvas");
    var ctx = canvas.getContext("2d");
    var originalPixels = null;
    var currentPixels = null;
    
    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;
    }
    

我们需要颜色选择器中的颜色是 RGB 格式,而不是十六进制,所以如果您的选择器返回一个十六进制值来转换它,请使用这个函数:

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

现在是神奇的部分,让我们循环遍历像素数据并将其与颜色选择器中的颜色相乘。

在我的脚本上没有颜色选择器,我刚刚创建了一个简单的文本输入来输入十六进制颜色,下面的这个函数是输入按钮的 onclick 事件

    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) // If it's not a transparent pixel
            {
                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");
    }

看,诀窍是:

  • 获取原始像素颜色
  • 将其从范围 0-255 转换为 0-1
  • 将其乘以您想要的新颜色。

你可以在这里看到它的工作原理:http://users7.jabry.com/overlord/mug.html

  • 我确信它至少可以在 firefox 和 chrome 上运行。

  • 杯子轮廓看起来不太好,那是因为我刚刚在photoshop上做了一个快速的“魔术棒”,你以后可以做得更好。

【讨论】:

  • 请记住,此方法不支持 3 位十六进制代码,仅支持 6 位
  • @Delta 我感激不尽。伙计......你刚刚准备好了:)它工作得非常完美......太棒了。 :)
  • 演示链接失效
  • 像魔术一样工作,你帮了我很多
  • @Delta 我知道这是一个旧链接,但是是否可以使用背景 PNG 图像来做到这一点?
【解决方案2】:

您可以使用带有透明区域的杯子的剔除图片,为其设置背景并根据需要更改背景颜色。 cssTricks

这是一个基本示例,jsFiddle,使用 Farbtastic Color Picker

$('#colorpicker').farbtastic(function(color){
    $('img').css("background-color",color);
});​

【讨论】:

  • 这太棒了!非常聪明的想法;)
  • 这实际上应该是公认的答案... +1
【解决方案3】:

您应该使用 Nik Korablin 的 "Product Colorizer"。它支持一种或两种颜色,并且设置简单。

【讨论】:

  • 我不明白这不是正确的答案。优秀的!!谢谢!!!
  • Product Colorizer 的链接已失效。请更新它。
【解决方案4】:

您可以覆盖一个绝对定位的 .png,其 z-index 大于杯子的基本图像。覆盖层将是彩色杯子,如果需要,可以将背景剔除。通过事件处理程序根据需要交换覆盖层——也许添加/删除一个类?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-01
    • 2011-08-28
    • 2016-08-03
    • 1970-01-01
    • 2012-08-12
    相关资源
    最近更新 更多