/* * InfoHeader.java * * Created on 10 May 2006, 08:10 * * To change this template, choose Tools | Template Manager * and open the template in the editor. */ package com.inet.gradle.setup.image.image4j.codec.bmp; import java.io.IOException; /** * Represents a bitmap <tt>InfoHeader</tt> structure, which provides header information. * @author Ian McDonagh */ public class InfoHeader { /** * The size of this <tt>InfoHeader</tt> structure in bytes. */ public int iSize; /** * The width in pixels of the bitmap represented by this <tt>InfoHeader</tt>. */ public int iWidth; /** * The height in pixels of the bitmap represented by this <tt>InfoHeader</tt>. */ public int iHeight; /** * The number of planes, which should always be <tt>1</tt>. */ public short sPlanes; /** * The bit count, which represents the colour depth (bits per pixel). * This should be either <tt>1</tt>, <tt>4</tt>, <tt>8</tt>, <tt>24</tt> or <tt>32</tt>. */ public short sBitCount; /** * The compression type, which should be one of the following: * <ul> * <li>{@link BMPConstants#BI_RGB BI_RGB} - no compression</li> * <li>{@link BMPConstants#BI_RLE8 BI_RLE8} - 8-bit RLE compression</li> * <li>{@link BMPConstants#BI_RLE4 BI_RLE4} - 4-bit RLE compression</li> * </ul> */ public int iCompression; /** * The compressed size of the image in bytes, or <tt>0</tt> if <tt>iCompression</tt> is <tt>0</tt>. */ public int iImageSize; /** * Horizontal resolution in pixels/m. */ public int iXpixelsPerM; /** * Vertical resolution in pixels/m. */ public int iYpixelsPerM; /** * Number of colours actually used in the bitmap. */ public int iColorsUsed; /** * Number of important colours (<tt>0</tt> = all). */ public int iColorsImportant; /** * Calculated number of colours, based on the colour depth specified by {@link #sBitCount sBitCount}. */ public int iNumColors; /** * Creates an <tt>InfoHeader</tt> structure from the source input. * @param in the source input * @throws java.io.IOException if an error occurs */ public InfoHeader(com.inet.gradle.setup.image.image4j.io.LittleEndianInputStream in) throws IOException { //Size of InfoHeader structure = 40 iSize = in.readIntLE(); init(in, iSize); } /** * @since 0.6 */ public InfoHeader(com.inet.gradle.setup.image.image4j.io.LittleEndianInputStream in, int infoSize) throws IOException { init(in, infoSize); } /** * @since 0.6 */ protected void init(com.inet.gradle.setup.image.image4j.io.LittleEndianInputStream in, int infoSize) throws IOException { this.iSize = infoSize; //Width iWidth = in.readIntLE(); //Height iHeight = in.readIntLE(); //Planes (=1) sPlanes = in.readShortLE(); //Bit count sBitCount = in.readShortLE(); //calculate NumColors iNumColors = (int) Math.pow(2, sBitCount); //Compression iCompression = in.readIntLE(); //Image size - compressed size of image or 0 if Compression = 0 iImageSize = in.readIntLE(); //horizontal resolution pixels/meter iXpixelsPerM = in.readIntLE(); //vertical resolution pixels/meter iYpixelsPerM = in.readIntLE(); //Colors used - number of colors actually used iColorsUsed = in.readIntLE(); //Colors important - number of important colors 0 = all iColorsImportant = in.readIntLE(); } /** * Creates an <tt>InfoHeader</tt> with default values. */ public InfoHeader() { //Size of InfoHeader structure = 40 iSize = 40; //Width iWidth = 0; //Height iHeight = 0; //Planes (=1) sPlanes = 1; //Bit count sBitCount = 0; //caculate NumColors iNumColors = 0; //Compression iCompression = BMPConstants.BI_RGB; //Image size - compressed size of image or 0 if Compression = 0 iImageSize = 0; //horizontal resolution pixels/meter iXpixelsPerM = 0; //vertical resolution pixels/meter iYpixelsPerM = 0; //Colors used - number of colors actually used iColorsUsed = 0; //Colors important - number of important colors 0 = all iColorsImportant = 0; } /** * Creates a copy of the source <tt>InfoHeader</tt>. * @param source the source to copy */ public InfoHeader(InfoHeader source) { iColorsImportant = source.iColorsImportant; iColorsUsed = source.iColorsUsed; iCompression = source.iCompression; iHeight = source.iHeight; iWidth = source.iWidth; iImageSize = source.iImageSize; iNumColors = source.iNumColors; iSize = source.iSize; iXpixelsPerM = source.iXpixelsPerM; iYpixelsPerM = source.iYpixelsPerM; sBitCount = source.sBitCount; sPlanes = source.sPlanes; } /** * Writes the <tt>InfoHeader</tt> structure to output * @param out the output to which the structure will be written * @throws java.io.IOException if an error occurs */ public void write(com.inet.gradle.setup.image.image4j.io.LittleEndianOutputStream out) throws IOException { //Size of InfoHeader structure = 40 out.writeIntLE(iSize); //Width out.writeIntLE(iWidth); //Height out.writeIntLE(iHeight); //Planes (=1) out.writeShortLE(sPlanes); //Bit count out.writeShortLE(sBitCount); //caculate NumColors //iNumColors = (int) Math.pow(2, sBitCount); //Compression out.writeIntLE(iCompression); //Image size - compressed size of image or 0 if Compression = 0 out.writeIntLE(iImageSize); //horizontal resolution pixels/meter out.writeIntLE(iXpixelsPerM); //vertical resolution pixels/meter out.writeIntLE(iYpixelsPerM); //Colors used - number of colors actually used out.writeIntLE(iColorsUsed); //Colors important - number of important colors 0 = all out.writeIntLE(iColorsImportant); } }