All Downloads are FREE. Search and download functionalities are using the official Maven repository.

ij.plugin.frame.ColorPicker Maven / Gradle / Ivy

Go to download

ImageJ is an open source Java image processing program inspired by NIH Image for the Macintosh.

There is a newer version: 1.54m
Show newest version
package ij.plugin.frame;
import ij.*;
import ij.plugin.*;
import java.awt.*;
import java.awt.event.*;
import java.util.Vector;
import javax.swing.BoxLayout;
import ij.process.*;
import ij.gui.*;

/** Implements the Image/Color/Color Picker command. */
public class ColorPicker extends PlugInDialog {
	public static int ybase = 2;
	private int colorWidth = 22;
	private int colorHeight = 16;
	private int columns = 5;
	private int rows = 20;
	private static final String LOC_KEY = "cp.loc";
	private static ColorPicker instance;
	private ColorGenerator cg; 
	private Canvas colorCanvas;
	TextField colorField;
	
    public ColorPicker() {
		super("CP");
		if (instance!=null) {
			instance.toFront();
			return;
		}
		double scale = Prefs.getGuiScale();
		instance = this;
		WindowManager.addWindow(this);
        int width = (int)(columns*colorWidth*scale);
        int height = (int)((rows*colorHeight+ybase)*scale);
        addKeyListener(IJ.getInstance());
		setLayout(new BorderLayout());
		cg = new ColorGenerator(width, height, new int[width*height]);
        cg.drawColors(colorWidth, colorHeight, columns, rows);
        colorCanvas = new ColorCanvas(width, height, this, cg, scale);
        Panel panel = new Panel();
		panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
        panel.add(colorCanvas);
		String hexColor = Colors.colorToString(Toolbar.getForegroundColor());
        colorField = new TextField(hexColor+" ",7);
        colorField.setEditable(false);
        colorField.select(hexColor.length(),hexColor.length());
        GUI.scale(colorField);
        panel.add(colorField);
        add(panel);
		setResizable(false);
		pack();
		Point loc = Prefs.getLocation(LOC_KEY);
		if (loc!=null)
			setLocation(loc);
		else
			GUI.centerOnImageJScreen(this);
		show();
	}
    
    public void close() {
	 	super.close();
		instance = null;
		Prefs.saveLocation(LOC_KEY, getLocation());
		IJ.notifyEventListeners(IJEventListener.COLOR_PICKER_CLOSED);
	}
	
	public static void update() {
		ColorPicker cp = instance;
		if (cp!=null && cp.colorCanvas!=null) {
			cp.cg.refreshBackground(false);
			cp.cg.refreshForeground(false);
			cp.colorCanvas.repaint();
			cp.colorField.setText(Colors.colorToString(Toolbar.getForegroundColor()));
		}
	}
	
}

class ColorGenerator extends ColorProcessor {
	private int ybase = ColorPicker.ybase;
    private int w, h;
    private int[] colors = {0xff0000, 0x00ff00, 0x0000ff, 0xffffff, 0x00ffff, 0xff00ff, 0xffff00, 0x000000};

    public ColorGenerator(int width, int height, int[] pixels) {
        super(width, height, pixels);
        setAntialiasedText(true);
    }
    
    void drawColors(int colorWidth, int colorHeight, int columns, int rows) {
        w = colorWidth;
        h = colorHeight;
        setColor(0xffffff);
        setRoi(0, ybase, 110, 320);
        fill();
        drawRamp();
        resetBW();
        flipper();
        //drawLine(0, 256, 110, 256);
        
        refreshBackground(false);
        refreshForeground(false);

        Color c;
        float hue, saturation=1f, brightness=1f;
        double w=colorWidth, h=colorHeight;
        for (int x=2; x<10; x++) {
            for (int y=0; y<32; y++) {
                hue = (float)(y/(2*h)-.15);
                if (x<6) { 
                    saturation = 1f;
                    brightness = (float)(x*4/w);
                } else {
                    saturation = 1f - ((float)((5-x)*-4/w));
                    brightness = 1f;
                }
                c = Color.getHSBColor(hue, saturation, brightness);
                setRoi(x*(int)(w/2), ybase+y*(int)(h/2), (int)w/2, (int)h/2);
                setColor(c);
                fill();
            }
        }
        drawSpectrum(h);        
        resetRoi();
    }
       
    void drawColor(int x, int y, Color c) {
        setRoi(x*w, y*h, w, h);
        setColor(c);
        fill();
    }

    public void refreshBackground(boolean backgroundInFront) {
        //Boundary for Background Selection
        setColor(0x444444);
        drawRect((w*2)-12, ybase+276, (w*2)+4, (h*2)+4);
        setColor(0x999999);
        drawRect((w*2)-11, ybase+277, (w*2)+2, (h*2)+2);
        setRoi((w*2)-10, ybase+278, w*2, h*2);//Paints the Background Color
        Color bg = Toolbar.getBackgroundColor();
        setColor(bg);
        fill();
        if (backgroundInFront)
        	drawLabel("B", bg, w*4-18, ybase+278+h*2);
    }

    public void refreshForeground(boolean backgroundInFront) {
        //Boundary for Foreground Selection
        setColor(0x444444);
        drawRect(8, ybase+266, (w*2)+4, (h*2)+4);
        setColor(0x999999);
        drawRect(9, ybase+267, (w*2)+2, (h*2)+2);
        setRoi(10, ybase+268, w*2, h*2); //Paints the Foreground Color
        Color fg = Toolbar.getForegroundColor();
        setColor(fg);
        fill();
        if (backgroundInFront)
        	drawLabel("F", fg, 12, ybase+268+14);
    }
    
    private void drawLabel(String label, Color c, int x, int y) {
		int intensity = (c.getRed()+c.getGreen()+c.getBlue())/3;
		c = intensity<128?Color.white:Color.black;
		setColor(c);
		drawString(label, x, y);
	}

	void drawSpectrum(double h) {
		Color c;
		for ( int x=5; x<7; x++) {
			for ( int y=0; y<32; y++) {
				float hue = (float)(y/(2*h)-.15);        
				c = Color.getHSBColor(hue, 1f, 1f);
				setRoi(x*(int)(w/2), ybase+y*(int)(h/2), (int)w/2, (int)h/2);
				setColor(c);
				fill();
			}
		}
		setRoi(55, ybase+32, 22, 16); //Solid red
		setColor(0xff0000);
		fill();
		setRoi(55, ybase+120, 22, 16); //Solid green
		setColor(0x00ff00);
		fill();
		setRoi(55, ybase+208, 22, 16); //Solid blue
		setColor(0x0000ff);
		fill();
		setRoi(55, ybase+80, 22, 8); //Solid yellow
		setColor(0xffff00);
		fill();
		setRoi(55, ybase+168, 22, 8); //Solid cyan
		setColor(0x00ffff);
		fill();
		setRoi(55, ybase+248, 22, 8); //Solid magenta
		setColor(0xff00ff);
		fill();
	}

    void drawRamp() {
        int r,g,b;
        for (int x=0; x>16;
		int g = (p&0xff00)>>8;
		int b = p&0xff;
		Color c = new Color(r, g, b);
		if (setBackground) {
			Toolbar.setBackgroundColor(c);
			if (Recorder.record)
				Recorder.setBackgroundColor(c);
		} else {
			Toolbar.setForegroundColor(c);
			if (Recorder.record)
				Recorder.setForegroundColor(c);
		}
	}

	void editColor() {
		Color c  = background?Toolbar.getBackgroundColor():Toolbar.getForegroundColor();
		ColorChooser cc = new ColorChooser((background?"Background":"Foreground")+" Color", c, false);
		c = cc.getColor();
		if (background)
			Toolbar.setBackgroundColor(c);
		else
			Toolbar.setForegroundColor(c);
	}
	
	public void refreshColors() {
		ip.refreshBackground(false);
		ip.refreshForeground(false);
		repaint();
	}
	
	private void showStatus(String msg, int rgb) {
		if (msg.length()>1)
			IJ.showStatus(msg);
		else {
			int r = (rgb&0xff0000)>>16;
			int g = (rgb&0xff00)>>8;
			int b = rgb&0xff;
			String hex = Colors.colorToString(new Color(r,g,b));
			IJ.showStatus("red="+pad(r)+", green="+pad(g)+", blue="+pad(b)+" ("+hex+") "+msg);
		}
	}
	
	public void mouseExited(MouseEvent e) {
		IJ.showStatus("");
		setCursor(defaultCursor);
	}

	public void mouseEntered(MouseEvent e) {
		setCursor(crosshairCursor);
	}

	public void mouseReleased(MouseEvent e) {}
	public void mouseClicked(MouseEvent e) {}
	public void mouseDragged(MouseEvent e) {}
	
}





© 2015 - 2025 Weber Informatics LLC | Privacy Policy