以编程方式生成渐变?
给定2 rgb颜色和矩形区域,我想生成一个基本的线性渐变之间的颜色。 我已经做了一个快速搜索,唯一能find的就是这个博客条目 ,但是示例代码似乎不见了,或者至少是这个post。 任何帮助,算法,代码示例,不管。 这将用Java编写,但是显示层已经被处理了,我只需要弄清楚如何找出显示内容。
你想要在第一和第二种颜色之间进行插值。 通过为每个组件(R,G,B)计算相同的插值,内插颜色很容易。 有很多插入方法。 最简单的是使用线性插值:只需要第一个颜色的百分比p和第二个百分比1- p :
R = firstCol.R * p + secondCol.R * (1 - p)
还有一个与此有关的问题 。
还有其他的插值方法有时候效果更好。 例如,使用钟形(S形)内插函数可使平滑过渡。
/编辑:糟糕,你的意思是使用预定义的function。 好的,更容易。 现在链接的博客post中有一个Python代码示例。
在Java中,你可以使用GradientPaint
。
您可以使用内置的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); }
使用基本的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); } } }
继续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 ) }
我一直在使用RMagick 。 如果你需要进一步的简单的渐变,ImageMagick和它的一个包装器(如RMagick或Java版的Java版)可能会有用。
- Retrofit 2.0如何获得反序列化的错误response.body
- 如何在Kotlin中为@PropertySource创建Java数组?
- Kotlin Firebase存储imageUri错误
- Android Studio 3.0 Canary 1:引用Kotlin类的Kotlin测试或Java测试失败
- 从ArrayList中删除偶数
- 在onCreate()中创建的类的Java.lang.VerifyError卡住
- IBM Bluemix Cloud Foundry SpringBoot kotlin应用程序错误
- Kotlin&Hibernate IllegalArgumentException:无法将字符串字段Job.name设置为Job
- kotlin翻新 – 背景粘性并发标记扫描GC释放65326(1448KB)AllocSpace对象,62(1736KB)LOS对象,