【问题标题】:Generating gradients programmatically?以编程方式生成渐变?
【发布时间】:2010-09-06 20:27:01
【问题描述】:

给定 2 种 rgb 颜色和一个矩形区域,我想在颜色之间生成一个基本的线性渐变。我进行了快速搜索,唯一能找到的是this blog entry,但示例代码似乎丢失了,或者至少在这篇文章中是这样。任何有帮助的东西,算法,代码示例,等等。这将是用Java编写的,但是显示层已经处理好了,我只需要弄清楚如何弄清楚要显示什么。

【问题讨论】:

    标签: java colors rgb gradient


    【解决方案1】:

    您想要在第一种和第二种颜色之间进行插值。通过为其每个分量(R、G、B)计算相同的插值,插值颜色很容易。插值的方法有很多。最简单的是使用线性插值:只取第一种颜色的百分比 p 和第二种颜色的百分比 1 - p

    R = firstCol.R * p + secondCol.R * (1 - p)
    

    another question与此相关。

    还有其他插值方法有时效果更好。例如,使用bell-shaped (sigmoidal) 插值函数可以使过渡更加平滑。

    /EDIT:糟糕,您的意思是使用预定义的函数。好的,更容易。您链接的博客文章现在有一个 Python 示例代码。

    在 Java 中,您可以使用 GradientPaint

    【讨论】:

    【解决方案2】:

    您可以使用内置的GradientPaint 类。

    void Paint(Graphics2D g, Regtangle r, Color c1, Color c2)
    {
      GradientPaint gp = new GradientPaint(0,0,c1,r.getWidth(),r.getHeight(),c2); 
      g.setPaint(gp);
      g.fill(rect);
    }
    

    【讨论】:

      【解决方案3】:

      使用基本的 AWT 类,您可以执行以下操作:

      import java.awt.Color;
      import java.awt.Graphics;
      import java.awt.Graphics2D;
      import java.awt.geom.Rectangle2D;
      import javax.swing.JPanel;
      
      public class LinearGradient extends JPanel {
      
          public void paint(Graphics g) {
              Graphics2D g2 = (Graphics2D) g;
              Color color1 = Color.RED;
              Color color2 = Color.BLUE;
              int steps = 30;
              int rectWidth = 10;
              int rectHeight = 10;
      
              for (int i = 0; i < steps; i++) {
                  float ratio = (float) i / (float) steps;
                  int red = (int) (color2.getRed() * ratio + color1.getRed() * (1 - ratio));
                  int green = (int) (color2.getGreen() * ratio + color1.getGreen() * (1 - ratio));
                  int blue = (int) (color2.getBlue() * ratio + color1.getBlue() * (1 - ratio));
                  Color stepColor = new Color(red, green, blue);
                  Rectangle2D rect2D = new Rectangle2D.Float(rectWidth * i, 0, rectWidth, rectHeight);
                  g2.setPaint(stepColor);
                  g2.fill(rect2D);
              }
          }
      }
      

      【讨论】:

        【解决方案4】:

        跟进 David Crow 的出色回答,这里有一个 Kotlin 示例实现

        fun gradientColor(x: Double, minX: Double, maxX: Double, 
                          from: Color = Color.RED, to: Color = Color.GREEN): Color {
            val range = maxX - minX
            val p = (x - minX) / range
        
           return Color(
                from.red * p + to.red * (1 - p),
                from.green * p + to.green * (1 - p),
                from.blue * p + to.blue * (1 - p),
                1.0
            )
        }
        

        【讨论】:

          【解决方案5】:

          我一直在使用RMagick for that。如果您需要更进一步的简单渐变,ImageMagick 及其包装器之一(如 RMagick 或 Java 的 JMagick)可能会很有用。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2014-10-25
            • 1970-01-01
            • 1970-01-01
            • 2011-04-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-06-23
            相关资源
            最近更新 更多