Hi, all.
 
I have 224 matrixes each of which is consisted of h by w Short, 16 Signed bit pixel loaded into memory.  Among these 224 matrix, I am selecting three matrixes to map into RGB value. 
 
My understanding was that since I have a range from -32767 to 32767 for each R, G, B, I presumed, I would have to sqaure root to fit into 8 bit red representation ranging 0 to 255, green, and blue.  This is shown below.
 
I created the bufferedImage class and am using the defaultToolKit.  I ran into some odd problems. 
 
The image is supposed to vary in color, depending on what I have selected for red, green, and blue.  However, the rendered image always seems dim. 
 
Was I supposed to normalize each three matrix instead of just algebraicly  square root?
 
Or  is is possible to create ColorModel and SampleModel in 48 bit representation for RGB?  (=16 bit Short * 3 for RGB)
 
Here is code snipet.
 
 /***********************************************************
   * Create dataBuffer for BufferedImage before invoke paint()
   */
  public void createDataForBufferedImage(SingleBandDataMatrix[] sbdm)
  {
    //This defindes the image size
    int width  = this.getPassedHeader().getSamples();
    int height = this.getPassedHeader().getLines();
   
    // This is the band index I choosed to load among 224 different matrix
    int redBandMatrixIndex  = this.getPassedSelectedRedBandNumber();
    int greenBandMatrixIndex= this.getPassedSelectedGreenBandNumber();
    int blueBandMatrixIndex = this.getPassedSelectedBlueBandNumber();
 
    //Declare temporary matrix to copy the original matrixs selected for Red, green, and blue
    int[][] redTempMatrix = new int[width][height];
    int[][] blueTempMatrix = new int[width][height];
    int[][] greenTempMatrix = new int[width][height];
 
   //Copy over the selected matrix to temporary matrix for red, green, and blue
    redTempMatrix = (int[][])sbdm[redBandMatrixIndex-1].getMatrix();
    greenTempMatrix = (int[][])sbdm[greenBandMatrixIndex-1].getMatrix();
    blueTempMatrix = (int[][])sbdm[blueBandMatrixIndex-1].getMatrix();
 
    //Below is the actual DataBuffer going into BufferedImage
    int[] data = "new" int[width*height];
 
   
    //Pack the ARGB into 32 bit(4 byte)
    int i=0;
    int z=0;
    //int[] red= new int[height*width];
     for (int y=0; y<height ;y++ )
     {
        for (int x=0; x<width ;x++ )
        {
 
          /*******************************************************
           * Need to pack the 2 byte of signed integer into 1 byte
           *******************************************************/
         // I am just adding 32768 to convert from Signed Short to UnSigned Short
        // And squre root to convert current 0-65536 to 0-255 value for integer.
          int red   = (int)Math.sqrt((double) redTempMatrix[x][y] +32768 )    ;
          int green = (int)Math.sqrt((double) greenTempMatrix[x][y]+32768 )   ;
          int blue  = (int)Math.sqrt((double)  blueTempMatrix[x][y]+32768 )   ;
 
       
          //Then pack into one RGB integer type pixel
          data[i++] = (red<<16)|(green<<8)|(blue);
 
        }
 
     }
    
image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);
     image.setRGB(0,0,width, height,data,0,width);
  
  }
  public void paint(Graphics g)
  {
    g.drawImage(image,0,0,this);
  }
Thanks in advance..
Kevin
 

Reply via email to