以编程方式生成渐变?
时间:2020-03-05 18:43:10 来源:igfitidea点击:
给定2种rgb颜色和一个矩形区域,我想在这些颜色之间生成基本的线性渐变。我已经进行了快速搜索,唯一能够找到的是此博客条目,但是示例代码似乎丢失了,或者至少是在发布此代码之时。任何帮助,算法,代码示例,等等。这将用Java编写,但是显示层已经处理完毕,我只需要弄清楚如何弄清楚要显示的内容即可。
解决方案
回答
我们需要在第一种和第二种颜色之间进行插值。通过为颜色的每个分量(R,G,B)计算相同的插值,可以轻松地对颜色进行插值。插值有很多方法。最简单的方法是使用线性插值:仅取第一种颜色的百分比p和第二种颜色的百分比1 p:
R = firstCol.R * p + secondCol.R * (1 - p)
还有另一个与此有关的问题。
还有其他插值方法有时效果更好。例如,使用钟形(S型)插值函数可使过渡更加平滑。
/ EDIT:糟糕,意思是使用预定义的函数。好的,甚至更容易。我们链接的博客文章现在有一个使用Python的示例代码。
在Java中,我们可以使用GradientPaint
。
回答
使用基本的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); } } }
回答
我们可以使用内置的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); }
回答
我一直在使用RMagick。如果需要进一步简化渐变,ImageMagick及其包装器之一(如Java的RMagick或者JMagick)可能会有用。