Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/359.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Java中绘制RGB色轮_Java_Colors_Color Wheel - Fatal编程技术网

如何在Java中绘制RGB色轮

如何在Java中绘制RGB色轮,java,colors,color-wheel,Java,Colors,Color Wheel,我试图在Java中绘制RGB色轮,但无法通过圆形获得渐变。我只想把它画在屏幕上,完全没有用户交互 这就是我目前所拥有的一切: public void paint (Graphics g){ super.paint(g); int red = 255; int green = 0; int blue = 0; int x1 = 500; int y1 = 305; int x2 = 5

我试图在Java中绘制RGB色轮,但无法通过圆形获得渐变。我只想把它画在屏幕上,完全没有用户交互

这就是我目前所拥有的一切:

public void paint (Graphics g){
        super.paint(g);

        int red = 255;
        int green = 0;
        int blue = 0;
        int x1 = 500;
        int y1 = 305;
        int x2 = 500;
        int y2 = 50;

        while (green != 255){
            g.setColor(new Color(red, green, blue));
            green++;
            g.drawLine(x1, y1, x2, y2);
            x2++;
            if (y2 < y1){
                y2++;
            }
        }
        while (red != 0){
            g.setColor(new Color(red, green, blue));
            red--;
            g.drawLine(x1, y1, x2, y2);
            x2--;
            y2++;
        }
        x2 = 500;
        while (blue != 255){
            g.setColor(new Color(red, green, blue));
            blue++;
            g.drawLine(x1, y1, x2, y2);
            x2--;
            if (y2 > y1){
                y2--;
            }
        }

        while (red != 255){
            green--;
            g.setColor(new Color(red, green, blue));
            red++;
            g.drawLine(x1, y1, x2, y2);
            x2++;
            y2--;
        }
    }                
}
public void绘制(图形g){
超级油漆(g);
红色整数=255;
绿色整数=0;
int蓝色=0;
int-x1=500;
int y1=305;
int x2=500;
int y2=50;
while(绿色!=255){
g、 setColor(新颜色(红色、绿色、蓝色));
绿色++;
g、 抽绳(x1、y1、x2、y2);
x2++;
if(y2y1){
y2--;
}
}
while(红色!=255){
绿色--;
g、 setColor(新颜色(红色、绿色、蓝色));
红色++;
g、 抽绳(x1、y1、x2、y2);
x2++;
y2--;
}
}                
}

这是在改变亮度 ,看起来最简单的增白方法是将颜色转换为HSB

float hsbVals[] = Color.RGBtoHSB( originalColor.getRed(),
                                   originalColor.getGreen(),
                                   originalColor.getBlue(), null );

    Color highlight = Color.getHSBColor( hsbVals[0], hsbVals[1], 
      0.5f * ( 1f + hsbVals[2] )); // Play with this part to modify rate of change
循环 从你所拥有的,看起来你基本上需要擦除除了中间的一个圆形区域以外的所有东西。

从中,似乎区域类是最简单的

 public void paintComponent(Graphics g) {
        Graphics2D g2 = (Graphics2D)g.create();
        Rectangle2D rectangleNotToDrawIn = new Rectangle2D.Double(100, 100, 20, 30); 
           // You will need to find out what size ellipse you need
        Area outside = calculateOutside(rectangleNotToDrawIn);

        // draw color wheel here

        g2.setPaint(Color.black); // assuming you want black
        g2.setClip(outside);
        g2.drawLine(0, 0, getWidth(), getHeight());

    }

// Change this method to take in an ellipse shape.
    private Area calculateOutside(Rectangle2D r) {
        Area outside = new Area(new Rectangle2D.Double(0, 0, getWidth(), getHeight()));
        outside.subtract(new Area(r));
        return outside;
    }

以下是我在Java中绘制RGB色轮的解决方案:

public class Main {

    public static void main(String[] args) {
        int rad = 1024;
        BufferedImage img = new BufferedImage(rad, rad, BufferedImage.TYPE_INT_RGB);

        // Center Point (MIDDLE, MIDDLE)
        int centerX = img.getWidth() / 2;
        int centerY = img.getHeight() / 2;
        int radius = (img.getWidth() / 2) * (img.getWidth() / 2);

        // Red Source is (RIGHT, MIDDLE)
        int redX = img.getWidth();
        int redY = img.getHeight() / 2;
        int redRad = img.getWidth() * img.getWidth();

        // Green Source is (LEFT, MIDDLE)
        int greenX = 0;
        int greenY = img.getHeight() / 2;
        int greenRad = img.getWidth() * img.getWidth();

        // Blue Source is (MIDDLE, BOTTOM)
        int blueX = img.getWidth() / 2;
        int blueY = img.getHeight();
        int blueRad = img.getWidth() * img.getWidth();

        for (int i = 0; i < img.getWidth(); i++) {
            for (int j = 0; j < img.getHeight(); j++) {
                int a = i - centerX;
                int b = j - centerY;

                int distance = a * a + b * b;
                if (distance < radius) {
                    int rdx = i - redX;
                    int rdy = j - redY;
                    int redDist = (rdx * rdx + rdy * rdy);
                    int redVal = (int) (255 - ((redDist / (float) redRad) * 256));

                    int gdx = i - greenX;
                    int gdy = j - greenY;
                    int greenDist = (gdx * gdx + gdy * gdy);
                    int greenVal = (int) (255 - ((greenDist / (float) greenRad) * 256));

                    int bdx = i - blueX;
                    int bdy = j - blueY;
                    int blueDist = (bdx * bdx + bdy * bdy);
                    int blueVal = (int) (255 - ((blueDist / (float) blueRad) * 256));

                    Color c = new Color(redVal, greenVal, blueVal);

                    float hsbVals[] = Color.RGBtoHSB(c.getRed(), c.getGreen(), c.getBlue(), null);

                    Color highlight = Color.getHSBColor(hsbVals[0], hsbVals[1], 1);

                    img.setRGB(i, j, RGBtoHEX(highlight));
                } else {
                    img.setRGB(i, j, 0xFFFFFF);
                }
            }
        }

        try {
            ImageIO.write(img, "png", new File("wheel.png"));
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public static int RGBtoHEX(Color color) {
        String hex = Integer.toHexString(color.getRGB() & 0xffffff);
        if (hex.length() < 6) {
            if (hex.length() == 5)
                hex = "0" + hex;
            if (hex.length() == 4)
                hex = "00" + hex;
            if (hex.length() == 3)
                hex = "000" + hex;
        }
        hex = "#" + hex;
        return Integer.decode(hex);
    }
}
公共类主{
公共静态void main(字符串[]args){
int rad=1024;
BuffereImage img=新的BuffereImage(rad,rad,BuffereImage.TYPE_INT_RGB);
//中心点(中间,中间)
int centerX=img.getWidth()/2;
int centerY=img.getHeight()/2;
int radius=(img.getWidth()/2)*(img.getWidth()/2);
//红色光源为(右、中)
int redX=img.getWidth();
int redY=img.getHeight()/2;
int redRad=img.getWidth()*img.getWidth();
//绿色光源为(左、中)
int-greenX=0;
int greenY=img.getHeight()/2;
int greenRad=img.getWidth()*img.getWidth();
//蓝色源为(中间,底部)
int blueX=img.getWidth()/2;
int blueY=img.getHeight();
int blueRad=img.getWidth()*img.getWidth();
对于(int i=0;i
检查这里非常感谢你,劳雷尔!