Code
// Colors: a Color Dialog | Java Graphics
// https://javagraphics.blogspot.com/2007/04/jcolorchooser-making-alternative.html
private BufferedImage updateImage() {
BufferedImage image = new BufferedImage(SIZE, SIZE, BufferedImage.TYPE_INT_ARGB);
int[] row = new int[SIZE];
float size = (float) SIZE;
float radius = size / 2f;
for (int yidx = 0; yidx < SIZE; yidx++) {
float y = yidx - radius;
for (int xidx = 0; xidx < SIZE; xidx++) {
float x = xidx - radius;
double theta = Math.atan2(y, x) - 3d * Math.PI / 2d;
if (theta < 0) {
theta += 2d * Math.PI;
}
double r = Math.hypot(x, y); // Math.sqrt(x * x + y * y);
float hue = (float) (theta / (2d * Math.PI));
float sat = Math.min((float) (r / radius), 1f);
float bri = 1f;
row[xidx] = Color.HSBtoRGB(hue, sat, bri);
}
image.getRaster().setDataElements(0, yidx, SIZE, 1, row);
}
return image;
}
// campbell: Java 2D Trickery: Soft Clipping Blog | Oracle Community
// https://community.oracle.com/blogs/campbell/2006/07/19/java-2d-trickery-soft-clipping
GraphicsConfiguration gc = g2.getDeviceConfiguration();
BufferedImage buf = gc.createCompatibleImage(s, s, Transparency.TRANSLUCENT);
Graphics2D g2d = buf.createGraphics();
g2d.setComposite(AlphaComposite.Src);
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
g2d.fill(new Ellipse2D.Float(0f, 0f, s, s));
g2d.setComposite(AlphaComposite.SrcAtop);
g2d.drawImage(colorWheelImage, 0, 0, null);
g2d.dispose();
g2.drawImage(buf, null, (getWidth() - s) / 2, (getHeight() - s) / 2);
g2.dispose();
References