2008-08-26 14 views
26

2 rgbの色と長方形の領域が与えられたら、色の間に基本的な線形勾配を生成したいと思います。私はすばやい検索を行いましたが、唯一見つけられたのはthis blog entryですが、サンプルコードが見つからないか、少なくともこの投稿の時点であったようです。何でも助け、アルゴリズム、コード例など。これはJavaで書かれていますが、表示レイヤーはすでに処理されているので、何を表示するかを理解する必要があります。プログラムでグラデーションを生成しますか?

答えて

35

第1色と第2色の間の補間が必要です。色を補間することは、その各成分(R、G、B)について同じ補間を計算することによって容易である。補間にはさまざまな方法があります。

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

これに関連another questionあります: - 2番目のPちょうど最初の色とパーセンテージ1の割合Pを取る:最も簡単な線形補間を使用することです。

補間方法には、他の方法ではうまくいかない場合もあります。例えば、補間関数bell-shaped (sigmoidal)を使用すると、遷移がスムーズになります。

/EDIT:あらかじめ定義された機能を使用することを意味します。 OK、さらに簡単です。今リンクしたブログ投稿にPythonのサンプルコードがあります。

Javaでは、GradientPaintを使用できます。基本AWTクラスを使用して

+2

だ、それが描かれている方法をより細かく制御することができますて、LinearGradientPaintもあります。 http://java.sun.com/javase/6/docs/api/java/awt/LinearGradientPaint.html – Avrom

7

、あなたはこのような何かを行うことができます:

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); 
     } 
    } 
} 
10

あなたは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); 
} 
0

私はRMagick for thatを使用しています。単純なグラデーションに進む必要がある場合は、ImageMagickとそのラッパーの1つ(Javaの場合はRMagickやJMagickなど)が便利です。デビッド・クロウのexecllentの答えにフォローアップ

+0

ページが利用できません........を参照してください。 – hyprfrcb

1

、ここでKotlinの実装例は、Java 1.6以上で

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 
    ) 
} 
関連する問題