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