>>>>> "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]

Reply via email to