import java.lang.*; import java.io.*; import java.awt.*; import java.awt.image.*; final public class BitmapOutputStream extends FilterOutputStream { int _cx, _cy; int _cBytesPerLine; byte _abBuffer[]; // little endian functions; final static void writeShort(byte ab[], int iIndex, short s) { ab[iIndex] = (byte)s; ab[iIndex + 1] = (byte)(s >>> 8); } final static void writeInt(byte ab[], int iIndex, int i) { ab[iIndex] = (byte)i; ab[iIndex + 1] = (byte)(i >>> 8); ab[iIndex + 2] = (byte)(i >>> 16); ab[iIndex + 3] = (byte)(i >>> 24); } // constructor; BitmapOutputStream(OutputStream out, int cx, int cy) throws IOException { super(out); _cx = cx; _cy = cy; _cBytesPerLine = (cx * 3 + 3) & ~3; _abBuffer = new byte[_cBytesPerLine]; int cbImage = _cBytesPerLine * cy; byte abHeader[] = new byte[Bitmap.VER2_DEFAULT_OFFBITS]; for (int iIndex = 0; iIndex < Bitmap.VER2_DEFAULT_OFFBITS; iIndex++) { abHeader[iIndex] = 0; } writeShort(abHeader, Bitmap.USTYPE, Bitmap.BITMAP_TYPE); writeInt(abHeader, Bitmap.CBSIZE, Bitmap.VER2_DEFAULT_OFFBITS + cbImage); writeInt(abHeader, Bitmap.OFFBITS, Bitmap.VER2_DEFAULT_OFFBITS); writeInt(abHeader, Bitmap.FILE_HEADER_SIZE + Bitmap.CBFIX, Bitmap.VER2_DEFAULT_HEADER_SIZE); writeInt(abHeader, Bitmap.FILE_HEADER_SIZE + Bitmap.CX_2, cx); writeInt(abHeader, Bitmap.FILE_HEADER_SIZE + Bitmap.CY_2, cy); writeShort(abHeader, Bitmap.FILE_HEADER_SIZE + Bitmap.CPLANES_2, (short)1); writeShort(abHeader, Bitmap.FILE_HEADER_SIZE + Bitmap.CBITCOUNT_2, (short)24); writeInt(abHeader, Bitmap.FILE_HEADER_SIZE + Bitmap.CBIMAGE, cbImage); out.write(abHeader); } final public int xSize() { return _cx; } final public int ySize() { return _cy; } final public int bytesPerLine() { return _cBytesPerLine; } final public void writeLine(int aiLine[], int iOffsetInt) throws IOException { for (int x = 0, iOffsetByte = 0; x < _cx; x++) { int rgb = aiLine[iOffsetInt++]; _abBuffer[iOffsetByte++] = (byte)rgb; _abBuffer[iOffsetByte++] = (byte)(rgb >>> 8); _abBuffer[iOffsetByte++] = (byte)(rgb >>> 16); } out.write(_abBuffer); } }