如何在没有Javafx / AWT的情况下创建颜色渐变?

时间:2016-10-17 21:31:58

标签: java eclipse colors linear-gradients

所以我有一点问题,我试着解决它几个小时。 我有一个BufferedImage,我想以流畅的方式改变颜色f.e.从红色到白色。 我的主要:

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 {
        ,,,

我改变颜色的方法:

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

}

所以我玩这个方法,但我不能完成它。 我最好的解决方案&#34;是这样的:

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

否则返回新颜色(r,g,b).getRGB();

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分: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();
            }
        });
    }
}