获取两种颜色之间的中间颜色

3
我有两个颜色的字符串表示(例如:"#FFFFFF" 和 "#000000"),我正在寻找一种以编程方式获取这两个颜色中间色的方法。所谓的“中位数”颜色是指在这两个颜色之间相遇的颜色。

我需要这个中间色以便绘制一个2步渐变:

  • 从第一种颜色到中间颜色的1个渐变。
  • 从中间颜色到第二个颜色的1个渐变。

这样看起来就像从第一种颜色到第二种颜色的1个渐变,但我无法实现。

我该如何实现呢?


为什么不能分别对三个组件进行平均? - Dawood ibn Kareem
你应该明确“中位数”的含义。但我认为它只是每个RGB分量的平均值,对吗? - Seelenvirtuose
一种颜色可以分为(R,G,B)或(H,S,V),然后您可以取单个组件方面的中位数。除了简单的平均值之外,还可以进行“伽马”校正,但在这里并不必要。Color.getRed()/Green/Blue, new Color(r, g, b) - Joop Eggen
2个回答

5

1
不错。我只是想知道为什么它会接受一个 Object,而在文档中他们要求一个“32位整数值”。 - Enrichman
这需要至少 API-11 - VenomVendor
ArgbEvaluator 只是一个线性插值器。 - Blackbelt

2
我将分别处理每个RGB组件。您可以使用Long.valueOf()将十六进制解析为数字。平均两个值(必要时四舍五入),然后使用Long.toString()返回十六进制,补足两位。

以下是一些示例代码,我没有测试:

     String colour1 = "#FFFFFF";
     String colour2 = "#000000";

     StringBuilder result = new StringBuilder("#");
     for (int i=0;i<3;i++) {
         String h1 = colour1.substring(i*2+1, 3+(i*2));
         String h2 = colour2.substring(i*2+1, 3+(i*2));

         long l1 = Long.parseLong(h1, 16);
         long l2 = Long.parseLong(h2, 16);

         long mid = (l1 + l2) / 2; //truncating not rounding

         String midStr = Long.toString(mid, 16);
         if (midStr.length() == 1) {
             result.append("0");
         }
         result.append(midStr.toUpperCase());

     }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接