SimpleColorPicker.pde
Here is the code for a simple Processing GUI utility for editing color palettes. It generates gradients given a start and end color. It will print palettes as hex strings and RGB triplets, change the "prefix" and "suffix" variables to turn the output into readymade code.
I whipped this up to make it easy to make decent color combos for a current project I'm working on. It could do with a few more features, like a 2D RGB color field to choose from and the ability to save and maybe even load files. It feeds into a color library I use, maybe I'll make that available at some point to make it a bit more useful.
Source code - SimpleColorPicker.pde
// SimpleColorPicker.pde // Marius Watz - http://workshop.evolutionzone.com // Interactive creation of gradient palettes. // Will print palettes as hex and RGB triplets. // Select either left or right side of the gradient boxes // to edit that color. // By pressing 'd' the "dropper" mode is activated, clicking // on a color will fill the currently selected slot with that // color. int rgb[][]; float R,G,B; int sel,numrows,barTop,barRight; boolean isDropper,whiteBG=false,edited[]; PFont font; void setup() { size(10*20+15,10*20+200); font=createFont("Arial", 10); numrows=10; rgb=new int[numrows*2][3]; edited=new boolean[numrows]; for(int i=0; i<numrows; i++) { fillRGB(i*2, 50,50,50); fillRGB(i*2+1, 255,255,255); edited[i]=false; } R=50; G=50; B=50; sel=0; barTop=20*10+60; barRight=10+9*20+5; } void draw() { float rD,gD,bD,r,g,b; noStroke(); if(whiteBG) background(255); else background(0); // draw title fill(0xFFEBAC32); rect(0,0,width,20); fill(255,255,255); textFont(font,10); text("SimpleColorPicker 0.9", 10,13); // draw selection if(sel!=-1) { if(isDropper) fill(255,0,0); else fill(255); rect(10+(9*20*(sel%2))-1,30+20*(sel/2)-1, 17,17); } // draw color boxes for(int i=0; i<numrows; i++) { rD=(float)(rgb[i*2+1][0]-rgb[i*2][0])/9f; gD=(float)(rgb[i*2+1][1]-rgb[i*2][1])/9f; bD=(float)(rgb[i*2+1][2]-rgb[i*2][2])/9f; for(int j=0; j<10; j++) { r=rgb[i*2][0]+rD*(float)j; g=rgb[i*2][1]+gD*(float)j; b=rgb[i*2][2]+bD*(float)j; fill(r,g,b); rect(10+j*20,30+i*20, 15,15); } } // draw big color field fill(R,G,B); rect(10,barTop+10, barRight,30); // draw smaller contrast color field int sel2=sel+1; if(sel%2==1) sel2=sel-1; // println("sel "+sel+" sel2 "+sel2); fill(rgb[sel2][0],rgb[sel2][1],rgb[sel2][2]); rect(10,barTop+40, barRight,10); // color bar background fill(60); rect(10,barTop+60, barRight, 10); rect(10,barTop+75, barRight, 10); rect(10,barTop+90, barRight, 10); // color bar foreground fill(255); rect(10,barTop+60, barRight*(float)R/255, 10); rect(10,barTop+75, barRight*(float)G/255, 10); rect(10,barTop+90, barRight*(float)B/255, 10); // draw title fill(0xFFEBAC32); rect(0,barTop-25,width,20); fill(255); text("'p' to print palette, 'd' to use dropper", 10,barTop-12); } void printColors() { // change this to add readymade function calls for pasting into your code String prefix=""; String suffix=""; println(""); for(int i=0; i<numrows; i++) if(edited[i]) { print(prefix); print("""+getColString(i*2)+"", ""+getColString(i*2+1)+"""); println(suffix); } println(""); for(int i=0; i<numrows; i++) if(edited[i]) { print(prefix); print(getColStringNumeric(i*2)+", "+ getColStringNumeric(i*2+1)); println(suffix); } } String getColStringNumeric(int id) { String s; s=""+rgb[id][0]+", "+rgb[id][1]+", "+rgb[id][2]; return s; } String getColString(int id) { String s=Integer.toHexString(color(rgb[id][0],rgb[id][1],rgb[id][2])); s=s.substring(2).toUpperCase(); return s; } void mousePressed() { int mx=(mouseX-10)/20; int my=(mouseY-30)/20; if(mx<10 && (my<10)) { mx=(mx/5); int newsel=my*2+mx; if(isDropper) { fillRGB(sel, rgb[newsel][0],rgb[newsel][1],rgb[newsel][2]); R=rgb[sel][0]; G=rgb[sel][1]; B=rgb[sel][2]; isDropper=false; } else { sel=newsel; R=rgb[sel][0]; G=rgb[sel][1]; B=rgb[sel][2]; } // println("mx "+mx+" my "+my+" "+(mx/9)+" sel "+sel); } else { my=(mouseY-(barTop+60))/15; if(my<3 && my>-1) { mx=mouseX-10; if(mx<0) mx=0; else if(mx>barRight) mx=barRight; float val=(float)(mx*255)/(float)barRight; if(my==0) R=val; if(my==1) G=val; if(my==2) B=val; if(sel!=-1) fillRGB(sel, (int)R,(int)G,(int)B); edited[sel/2]=true; // println("mx "+mx+" val "+val+" R "+R+" G "+G+" B "+B); } } } void mouseDragged() { mousePressed(); } void keyPressed() { if(key=='p') printColors(); if(key=='d') isDropper=!isDropper; if(key=='b') whiteBG=!whiteBG; } void fillRGB(int id, int r,int g, int b) { rgb[id][0]=r; rgb[id][1]=g; rgb[id][2]=b; }




