2016-10-17 7 views
0

私は少し問題があり、私は時間からそれを解決しようとします。 私はBufferedImageを持っており、私は流暢な方法で色を変更したいと思います。赤から白まで。 私の主:Javafx/AWTを使用せずにカラーグラデーションを作成する方法は?

static int color12(int x, int y) {  
    int size = 100; 
    if (Math.abs(width/2 - x) < size/2 && Math.abs(height/2 - y) < size/2) 
     return new Color(255, 0, 0).getRGB(); 
    else 
     return new Color(200, 200, 255).getRGB(); 
} 

}

は、だから私はこの方法で遊んが、私はそれを成し遂げるカント:

public static void main(String[] args) { 
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 

    for (int x = 0; x != width; x++) { 
     for (int y = 0; y != height; y++) { 
      image.setRGB(x, y, color12(x, y)); 



    try { 
     ,,, 

私の方法は、色を変更します。 私の最高の "ソリューション" は、このでした:他に

int r = 0 ;  
    int b = 0; 
    int g = 0; 
    for (int i = 1; i < 255; i++) 
r++; 

新色(R、G、B).getRGB()を返します。

誰でも手伝ってもらえますか?

答えて

1

どのようにグラデーション(水平、垂直、斜めなど)を使用するかはわかりませんが、ここでは水平または垂直グラデーションに線形補間を使用する例を示します。

import java.awt.Color; 
import java.awt.image.BufferedImage; 
import javax.swing.BoxLayout; 
import javax.swing.ImageIcon; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.SwingUtilities; 

public class ExampleFrame extends JFrame { 

    private static enum GradientOrientation { 
     HORIZONTAL, VERTICAL 
    }; 

    private static BufferedImage createGradientImg(int width, int height, Color startColor, Color endColor, GradientOrientation o) { 
     BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
     for (int x = 0; x < width; x++) { 
      for (int y = 0; y < height; y++) { 
       int pos = o.equals(GradientOrientation.HORIZONTAL) ? x : y; 
       int size = o.equals(GradientOrientation.HORIZONTAL) ? width : height; 
       image.setRGB(x, y, getGradientRGB(startColor, endColor, pos, size)); 
      } 
     } 
     return image; 
    } 

    private static int getGradientRGB(Color startColor, Color endColor, int pos, int size) { 
     double perc = (double) pos/size; 
     int newRed = (int) (endColor.getRed() * perc + startColor.getRed() * (1 - perc)); 
     int newGreen = (int) (endColor.getGreen() * perc + startColor.getGreen() * (1 - perc)); 
     int newBlue = (int) (endColor.getBlue() * perc + startColor.getBlue() * (1 - perc)); 
     return new Color(newRed, newGreen, newBlue).getRGB(); 
    } 

    public void createAndShow() { 
     BufferedImage img1 = createGradientImg(200, 100, Color.RED, 
       Color.WHITE, GradientOrientation.HORIZONTAL); 
     BufferedImage img2 = createGradientImg(200, 100, Color.BLUE, 
       Color.YELLOW, GradientOrientation.HORIZONTAL); 
     BufferedImage img3 = createGradientImg(200, 100, Color.WHITE, 
       Color.YELLOW, GradientOrientation.VERTICAL); 
     BufferedImage img4 = createGradientImg(200, 100, Color.BLACK, 
       Color.WHITE, GradientOrientation.VERTICAL); 

     BoxLayout layout = new BoxLayout(getContentPane(), BoxLayout.Y_AXIS); 
     getContentPane().setLayout(layout); 
     getContentPane().add(new JLabel(new ImageIcon(img1))); 
     getContentPane().add(new JLabel(new ImageIcon(img2))); 
     getContentPane().add(new JLabel(new ImageIcon(img3))); 
     getContentPane().add(new JLabel(new ImageIcon(img4))); 
     pack(); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setVisible(true); 
    } 

    public static void main(String[] args) { 

     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       ExampleFrame ef = new ExampleFrame(); 
       ef.createAndShow(); 
      } 
     }); 
    } 
} 
+0

しかし、私はスイングまたはawtを使用したくありません:静的なintカラーメソッドを編集するだけでタスクを伴奏することは可能ですか? –

+0

私はあなたが達成しようとしていることを完全には分かっていませんが、 'getGradientRGB()'メソッドの 'color12()'メソッドを変更することができます。私の例でグラデーションイメージを作成するために使用される唯一のクラスは、元の質問ごとに 'BufferedImage'と' Color'です。どちらも 'awt'パッケージの一部です。残りはまったくデモンストレーションのためのものであり、例として表示するためのもので、GUIとして表示するためにはawt/Swing/JavaFX/swt/etcを使用する必要があります。最初からライブラリを構築したい場合を除きます。 –

+0

こんにちは。だから私は赤で始めるために私の色を作りたいと思っており、段階的に(255,0,0)から(255,255,255)になります。私のcolor12メソッドはすでに色を作成していますが、1つではありません。私は多くの色を(赤から白まで)欲しい。私はメインとメソッドで周りに遊んだが、正しい方法でそれを得ることができなかった。私はちょうどcolor12にforまたはwhileメソッドを追加する必要があると思うが、確かに私は理解していないかもしれない。多分あなたは私の英語を流暢ではないので、 –

関連する問題