>>>>> "JI" == Jun Inamori <[EMAIL PROTECTED]> writes:
JI> Hi Thomas, >> Correct GIMP creates palette that adapts to the contents of the >> image. There are many ways of doing this, I don't know what method >> GIMP uses but it is probably a pretty good one, the one I >> referenced earlier is also pretty good and very standard. JI> While I don't understand what GIMP is doing, the resulting PNG JI> will be the good starting point for me. Because I'm not familiar JI> with the image manipulation at all, my first step is to know "What JI> is the desirable Color Palette?" :-) I played with the indexed PNG JI> from GIMP. The next code fragment prints the RGB values in the JI> indexed Color Palette: This looks ok. One point you seem to be missing is that the red, greens & blues aren't independent things. They are tied togeather as a 24bit quanitity. So it is much more correct to print the triplet rather than each color seperately. int mask = 0x00FF; // Short hand for Integer.parseInt("00ff",16); for (int i=0; i<mapSize; i++) System.out.println("Color: [" + ((int)red [i])&mask + ", " ((int)green[i])&mask + ", " ((int)blue [i])&mask + "]"); JI> From RGB-PNG, I should calculate the values for: JI> byte[] red=new byte[x]; byte[] green=new byte[x]; byte[] JI> blue=new byte[x]; JI> Then, I can use: JI> IndexColorModel model=new IndexColorModel(8,x,red,green,blue); new JI> BufferedImage(w, h, BufferedImage.TYPE_BYTE_INDEXED, model); JI> Is this the way to go? correct this is how you would construct the buffered image to draw the RGB image into. JI> Anyway, I tried to pick up all the available colors in RGB-PNG. JI> Only way I found is.... Once again you are treating the RGB's as independent you can't do this. Usually what is done is that you make an array indexed by the first 3-4 bits of each color: private static class Counter { public int val; public int count=1; public Counter(int val) { this.val = val; } public boolean add(int val) { // See if the value matches us... if (this.val != val) return false; count++; return true; } } // Using 4 bits from RG & B. Vector [] colors = new Vector[1<12]; int rgb=0; for(int i_w=0; i_w<w; i_w++){ for(int i_h=0; i_h<h; i_h++){ rgb=bi.getRGB(i_w,i_h); // Get index from high four bits of each component. int idx = (((rgb&0xF00000)>>> 12) | ((rgb&0x00F000)>>> 8) | ((rgb&0x0000F0)>>> 4)) // Get the 'hash vector' for that key. Vector v = colors[idx]; if (v == null) { // No colors in this bin yet so create vector and add color. v = new Vector(); v.add(new Counter(rgb)); colors[idx] = v; } else { // find our color in the bin or create a counter for it. Iterator i = v.iterator(); while (i.hasNext()) // try adding our color to each counter... if (((Counter)i.next()).add(rgb)) break; if(!i.hasNext()) v.add(new Counter(rgb)); } } Now you have every unique color in the image stored in the various bins of colors, and you have a count for each color. So if there are more than 256 colors (which there often will be) you can select which colors to use based on frequency... JI> I think I made a little progress, but I'm not sure if this is the JI> right way or not. The above should help get you back on track... --------------------------------------------------------------------- To unsubscribe, e-mail: [EMAIL PROTECTED] For additional commands, e-mail: [EMAIL PROTECTED]