protected static Image readMap32(FileInputStream fs, BitmapHeader bh)
            throws IOException
    {
        Image image;
        // No Palatte data for 24-bit format but scan lines are
        // padded out to even 4-byte boundaries.
        int xwidth = bh.nsizeimage / bh.nheight;
        int ndata[] = new int[bh.nheight * bh.nwidth];
        byte brgb[] = new byte[bh.nwidth * 4 * bh.nheight];
        fs.read(brgb, 0, bh.nwidth * 4 * bh.nheight);
        int nindex = 0;
        for (int j = 0; j < bh.nheight; j++)
        {
            for (int i = 0; i < bh.nwidth; i++)
            {
                ndata[bh.nwidth * (bh.nheight - j - 1) + i] = constructInt3(
                        brgb, nindex);
                nindex += 4;
            }
        }
        image = Toolkit.getDefaultToolkit().createImage
        (new MemoryImageSource(bh.nwidth, bh.nheight,
        ndata, 0, bh.nwidth));
        fs.close();
        return (image);
    }
    /**
     * readMap24 internal routine to read the bytes in a 24 bit bitmap
     * Arguments:
     * fs - file stream
     * bh - header struct
     * Returns:
     * Image Object, be sure to check for (Image)null !!!!
     */
    protected static Image readMap24(FileInputStream fs, BitmapHeader bh)
            throws IOException
    {
        Image image;
        // No Palatte data for 24-bit format but scan lines are
        // padded out to even 4-byte boundaries.
        int npad = (bh.nsizeimage / bh.nheight) - bh.nwidth * 3;
        int ndata[] = new int[bh.nheight * bh.nwidth];
        byte brgb[] = new byte[(bh.nwidth + npad) * 3 * bh.nheight];
        fs.read(brgb, 0, (bh.nwidth + npad) * 3 * bh.nheight);
        int nindex = 0;
        for (int j = 0; j < bh.nheight; j++)
        {
            for (int i = 0; i < bh.nwidth; i++)
            {
                ndata[bh.nwidth * (bh.nheight - j - 1) + i] = constructInt3(
                        brgb, nindex);
                nindex += 3;
            }
            nindex += npad;
        }
        image = Toolkit.getDefaultToolkit().createImage
        (new MemoryImageSource(bh.nwidth, bh.nheight,
        ndata, 0, bh.nwidth));
        fs.close();
        return (image);
    }
    /**
     * readMap8 internal routine to read the bytes in a 8 bit bitmap
     * Arguments:
     * fs - file stream
     * bh - header struct
     * Returns:
     * Image Object, be sure to check for (Image)null !!!!
     */
    protected static Image readMap8(FileInputStream fs, BitmapHeader bh)
            throws IOException
    {
        Image image;
        // Have to determine the number of colors, the clrsused
        // parameter is dominant if it is greater than zero. If
        // zero, calculate colors based on bitsperpixel.
        int nNumColors = 0;
        if (bh.nclrused > 0)
        {
            nNumColors = bh.nclrused;
        }
        else
        {
            nNumColors = (1 & 0xff) << bh.nbitcount;
        }
        //     System.out.println("The number of Colors is"+nNumColors);
        // Some bitmaps do not have the sizeimage field calculated
        // Ferret out these cases and fix 'em.
        if (bh.nsizeimage == 0)
        {
            bh.nsizeimage = ((((bh.nwidth * bh.nbitcount) + 31) & ~31) >> 3);
            bh.nsizeimage *= bh.nheight;
            //          System.out.println("nsizeimage (backup) is"+nsizeimage);
        }
        // Read the palatte colors.
        int npalette[] = new int[nNumColors];
        byte bpalette[] = new byte[nNumColors * 4];
        fs.read(bpalette, 0, nNumColors * 4);
        int nindex8 = 0;
        for (int n = 0; n < nNumColors; n++)
        {
            npalette[n] = constructInt3(bpalette, nindex8);
            nindex8 += 4;
        }
        // Read the image data (actually indices into the palette)
        // Scan lines are still padded out to even 4-byte
        // boundaries.
        int npad8 = (bh.nsizeimage / bh.nheight) - bh.nwidth;
        //    System.out.println("nPad is:"+npad8);
        int ndata8[] = new int[bh.nwidth * bh.nheight];
        byte bdata[] = new byte[(bh.nwidth + npad8) * bh.nheight];
        fs.read(bdata, 0, (bh.nwidth + npad8) * bh.nheight);
        nindex8 = 0;
        for (int j8 = 0; j8 < bh.nheight; j8++)
        {
            for (int i8 = 0; i8 < bh.nwidth; i8++)
            {
                ndata8[bh.nwidth * (bh.nheight - j8 - 1) + i8] =
                npalette[((int) bdata[nindex8] & 0xff)];
                nindex8++;
            }
            nindex8 += npad8;
        }
        image = Toolkit.getDefaultToolkit().createImage
        (new MemoryImageSource(bh.nwidth, bh.nheight,
        ndata8, 0, bh.nwidth));
        return (image);
    }
    /**
     * load method - see read for details
     * Arguments:
     * sdir and sfile are the result of the FileDialog()
     * getDirectory() and getFile() methods.
     * Returns:
     * Image Object, be sure to check for (Image)null !!!!
     */
    public static Image load(String sdir, String sfile) {
        return (load(sdir + sfile));
    }
    /**
     * load method - see read for details
     * Arguments:
     * sdir - full path name
     * Returns:
     * Image Object, be sure to check for (Image)null !!!!
     */
    public static Image load(String sdir)
    {
        try
        {
            FileInputStream fs = new FileInputStream(sdir);
            return (read(fs));
        }
        catch (IOException ex) {
            return (null);
        }
    }
    public static void main(String[] args) throws IOException
   {
        if (args.length == 0) {
            System.out.println("请您输入.BMP文件");
            System.exit(0);
 }
       FileInputStream in = new FileInputStream(args[0]);
        Image TheImage = read(in);
        JFrame TheFrame = new JFrame(args[0]);
        JLabel TheLabel = new JLabel(new ImageIcon(TheImage));
        TheFrame.getContentPane().add(new JScrollPane(TheLabel));
        TheFrame.setSize(300, 300);
        TheFrame.setVisible(true);
    }
    //end class BMPLoader
}