【问题标题】:Trying to calculate the Pixastic color adjust values from a hex or RGB color尝试从十六进制或 RGB 颜色计算 Pixastic 颜色调整值
【发布时间】:2013-06-01 14:38:45
【问题描述】:

我继承了一个小型 Web 应用程序,该应用程序具有用户可以从下拉列表中选择颜色,然后对图像的一部分进行着色的功能。

着色是通过名为 Pixastic 的 Javascript 库进行的。

Pixastic 将图像加载到画布元素中,然后使用其Pixastic coloradjust 函数处理图像。

在我的例子中,正在处理的图像是带有黑色/灰色轮廓的透明 PNG。最终结果是只有黑色/灰色轮廓被着色。

但这是棘手的部分。

Pixastic coloradjust 函数不仅仅采用十六进制或 RGB 颜色。它需要一组 adjustment parementers 来调整红色、绿色和蓝色通道。每个调整值可以是从-1到1的十进制数。

coloradjust 函数基本上是这样工作的:

  • r为红色通道调整值。
  • 多个r * 255,结果为redVal
  • 循环遍历图像中的每个像素
  • redVal添加到像素的红色值(redPixel)
  • 如果redVal + redPixel
  • 如果redVal + redPixel > 255,则设置像素为255
  • 否则,将像素设置为redVal + redPixel *对绿色和蓝色通道做同样的事情。

如果有帮助,这里是coloradjust function 的实际代码。

我有一个现有颜色和调整值的列表。

我的任务是为应用程序添加一些新颜色,但我完全被困在弄清楚如何计算给定十六进制颜色的 PIxastic 的颜色调整值。

现有的十六进制颜色和调整值之间似乎没有任何关联,所以恐怕现有的调整值是有人手动计算出来的。

以下是现有系统中的一些示例颜色:

  • #603314
    • 红色调整-0.1
    • 绿色调整-0.5
    • 蓝色调-0.3
  • #82bad4
    • 红色调整0.2
    • 绿色调整0.4
    • 蓝色调0.4

鉴于以上所有情况,我如何计算新的十六进制颜色(如#cc9e3c)的颜色调整值?

【问题讨论】:

    标签: javascript pixastic


    【解决方案1】:

    我已经尝试创建一些函数来返回红色、绿色和蓝色比例,即问题描述的方式。但是,我的计算与示例都不匹配,所以我猜我不完全理解这个问题。不过……

    function redScale(colorInput) {return parseInt(colorInput.substring(1,3),16)/255 * 2 - 1;}
    function grnScale(colorInput) {return parseInt(colorInput.substring(3,5),16)/255 * 2 - 1;}
    function bluScale(colorInput) {return parseInt(colorInput.substring(5,7),16)/255 * 2 - 1;}
    

    substring 方法从 colorInput 字符串中获取两位十六进制值。获得两位十六进制字符串后,我使用 parseInt 将其转换为十进制。将它除以 255,得到从 0 到 1 的比例。由于比例从 -1 到 1(长度为 2),你将它乘以 2(得到 0 到 2 的比例),然后减 1,得到 -1 到 1 的比例。*/

    var colorInput = "#603314";
    
    rCS = redScale(colorInput);
    gCS = grnScale(colorInput);
    bCS = bluScale(colorInput);
    document.write("input: " + colorInput + "<br/>red: "+rCS+"<br/>","green: " + gCS + "<br/>" + "blue: " + bCS + "<br/><br/>");
    
    colorInput = "#82bad4";
    
    rCS = redScale(colorInput);
    gCS = grnScale(colorInput);
    bCS = bluScale(colorInput);
    document.write("input: " + colorInput + "<br/>red: "+rCS+"<br/>","green: " + gCS + "<br/>" + "blue: " + bCS + "<br/><br/>");
    
    colorInput = "cc9e3c";
    rCS = redScale(colorInput);
    gCS = grnScale(colorInput);
    bCS = bluScale(colorInput);
    
    document.write("input: " + colorInput + "<br/>red: "+rCS+"<br/>","green: " + gCS + "<br/>" + "blue: " + bCS);
    

    【讨论】:

    • 感谢您的意见。我会用你那里的东西做一些测试,看看是否有帮助。我所拥有的那些十六进制颜色完全有可能与调整值没有直接关联,并且调整值是手动找到的。
    • 我为您的代码创建了一个 jsfiddle,作为示例:jsfiddle.net/antelopelovefan/D3ubv
    • pixastic.com/lib/docs/actions/coloradjust 测试你的比例函数实际上看起来非常接近!很明显,调整#s与原来的不一样,但实际的颜色叠加似乎刚刚好。
    • 调整值可能需要手动导出。我创建的函数是一个直接计算,它可能不适用于从灰度着色到所需的“着色”颜色。您的结果也会因原始图像的灰度分布(直方图)而异...
    • 最后一条评论表明调整值是“手动”创建的。例如,它们只有 1 个有效数字(.2,而不是 .2489078134)。我敢打赌它们是手动推导出来的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 1970-01-01
    • 2018-10-22
    • 1970-01-01
    • 2012-06-28
    • 1970-01-01
    • 2021-02-17
    相关资源
    最近更新 更多