Re: Getting header info of a BMP file
"Jeff Higgins" <oohiggins@yahoo.com> wrote in message
news:CGdKj.43$Zp6.40@newsfe07.lga...
mmcclaf@gmail.com wrote:
On Apr 5, 9:36 pm, "Jeff Higgins" <oohigg...@yahoo.com> wrote:
mmcc...@gmail.com wrote:
But I'm kind of lost as to how to even output the colourtable to screen
I get:
java.lang.OutOfMemoryError: Java heap space
at this line:
pic.optionalPalette = new byte[nNumColors * 4];
using this bitmap file:
<http://preview.tinyurl.com/5263tj>.
The value of nNumColors is: 16777216
at the point of failure.
Is pic.optionalPalette you're "colourtable"?
I haven't had time to look any more just yet.
JH
public class CSE390Lab3McClafferty {
public static int constructInt3(byte[] in, int offset) {
int ret = 0xff;
ret = (ret << 8) | ((int) in[offset + 2] & 0xff);
ret = (ret << 8) | ((int) in[offset + 1] & 0xff);
ret = (ret << 8) | ((int) in[offset + 0] & 0xff);
return (ret);
}
public static void main(String[] args) {
CSE390Lab3BMPMcClafferty pic =
new CSE390Lab3BMPMcClafferty();
int nNumColors = 0;
try {
File bmp = new File("c://temp//FLAG_B24.BMP");
FileInputStream bitStream = new FileInputStream(bmp);
bitStream.skip(2);
pic.bfSize = bitStream.read() +
bitStream.read() * 256 +
bitStream.read() * 65536 +
bitStream.read() * 16777216;
bitStream.skip(12);
pic.biWidth = bitStream.read() +
bitStream.read() * 256 +
bitStream.read() * 65536 +
bitStream.read() * 16777216;
pic.biHeight = bitStream.read() +
bitStream.read() * 256 +
bitStream.read() * 65536 +
bitStream.read() * 16777216;
pic.biPlanes = bitStream.read() +
bitStream.read() * 256;
pic.biBitCount = bitStream.read() +
bitStream.read() * 256;
pic.biCompression = bitStream.read() +
bitStream.read() * 256 +
bitStream.read() * 65536 +
bitStream.read() * 16777216;
pic.biSizeImage = bitStream.read() +
bitStream.read() * 256 +
bitStream.read() * 65536 +
bitStream.read() * 16777216;
pic.biXPelsPerMeter = bitStream.read() +
bitStream.read() * 256 +
bitStream.read() * 65536 +
bitStream.read() * 16777216;
pic.biYPelsPerMeter = bitStream.read() +
bitStream.read() * 256 +
bitStream.read() * 65536 +
bitStream.read() * 16777216;
pic.biClrUsed = bitStream.read() +
bitStream.read() * 256 +
bitStream.read() * 65536 +
bitStream.read() * 16777216;
nNumColors = pic.biClrUsed;
pic.biClrImportant = bitStream.read() +
bitStream.read() * 256 +
bitStream.read() * 65536 +
bitStream.read() * 16777216;
// biClrUsed: Specifies the number of color indexes in the
// color table that are actually used by the bitmap.
// If this value is zero, the bitmap uses the maximum number
// of colors corresponding to the value of the biBitCount member
// for the compression mode specified by biCompression.
// If biClrUsed is nonzero and the biBitCount member is less than 16,
// the biClrUsed member specifies the actual number of colors the
// graphics engine or device driver accesses.
// If biBitCount is 16 or greater, the biClrUsed member specifies
// the size of the color table used to optimize performance of the
// system color palettes.
// If biBitCount equals 16 or 32, the optimal color palette starts
// immediately following the three DWORD masks.
// When the bitmap array immediately follows the BITMAPINFO structure,
// it is a packed bitmap. Packed bitmaps are referenced by a single
pointer.
// Packed bitmaps require that the biClrUsed member must be either
zero or
// the actual size of the color table.
if (pic.biClrUsed > 0) {
nNumColors = pic.biClrUsed;
}
else {
nNumColors = (1 & 0xff) << pic.biBitCount;
}
pic.optionalPalette = new byte[nNumColors * 4];
int npalette[] = new int[nNumColors];
// System.out.println("The number of Colors is"+ nNumColors);
bitStream.read(pic.optionalPalette, 0, nNumColors * 4);
int nindex8 = 0;
for (int n = 0; n < nNumColors; n++) {
npalette[n] = constructInt3(pic.optionalPalette, nindex8);
nindex8 += 4;
}
// [SNIP]
} catch (Exception e) {
System.out.println("Exception Thrown: " + e);
}
} // main method
}