源代码由两部分组成,即两个文件组成。其一为"PicsModel.java",主要存储图片的相关信息;其二位"readpic.java",获取图片的相关信息,是本文的重点所在。详细代码如下:  PicsModel.java代码:/*****************************************************************
* File name: PicsModel.java
* Create date: 2003-11-18
* Copyright: Copyright (c) 2003 by HEKAI
* @Version: 1.0
* Modify History
* Author Date Description
* hekai 2003-11-18 Create the PicsModel.java
*****************************************************************/
//请用你的相应包名进行替换
package bmptest; import java.io.Serializable;
public class PicsModel implements Serializable
{
 private String picsExtendName = null;
 private int picsWidth = 0;
 private int picsHeight = 0;
 private String picsColor = null;
 private String picsSize = null; public PicsModel()
 {
 } public String getpicsExtendName()
 {
  return picsExtendName;
 }
 public void setpicsExtendName(String picsExtendName)
 {
  this.picsExtendName = picsExtendName;
 } public int getpicsWidth()
 {
  return picsWidth;
 }
 public void setpicsWidth(int picsWidth)
 {
  this.picsWidth = picsWidth;
 } public int getpicsHeight()
 {
  return picsHeight;
 } 
 public void setpicsHeight(int picsHeight)
 {
  this.picsHeight = picsHeight;
 } public String getpicsColor()
 {
  return picsColor;
 }
 public void setpicsColor(String picsColor)
 {
  this.picsColor = picsColor;
 } public String getpicsSize()
 {
  return picsSize;
 }
 public void setpicsSize(String picsSize)
 {
  this.picsSize = picsSize;
 }
}readpic.java代码:/*****************************************************************
* File name: readpic.java
* Create date: 2003-11-18
* Copyright: Copyright (c) 2003 by HEKAI
* @Version: 1.0
* Modify History
* Author Date Description
* hekai 2003-11-18 Create the readpic.java
*****************************************************************/
//请用你的相应包名进行替换
package bmptest;import java.io.*;
public class readpic
{
 public static void main(String[] args)
 {
  PicsModel model = getFileAttributes("E:/hekai/hk0001.jpg");
  // "E:\\hekai\\hk0001.jpg" 也是可以的
  System.out.println("picextendname is:"+model.getpicsExtendName());
  System.out.println("picwidth is:"+model.getpicsWidth());
  System.out.println("picheight is:"+model.getpicsHeight());
  System.out.println("piccolor:"+model.getpicsColor());
  System.out.println("picsize:"+model.getpicsSize());
 } private static PicsModel getFileAttributes(String picpath)
 {
  PicsModel model = null;
  String picextendname;
  picextendname = null;
  byte[] content = null;  try
  {
   content = readFromFile(picpath);
   int k;
   k = content.length;
   //不想处理的话,请直接获取其字节数
   Integer kk;
   kk = null;
   String picsize;
   picsize = null;
   if (k >= 1024)
   {
    //bigger than fact pic file sizes
    k = k / 1024 + 1;
    kk = new Integer(k);
    picsize = kk.toString() + "K";
   }
   else if (k > 0)
   {
    kk = new Integer(k);
    picsize = kk.toString();
   }
   model = new PicsModel();
   model.setpicsSize(picsize);
  }
  catch( IOException e )
  {
   content = new byte[0];
   e.printStackTrace();
  }  picextendname = getFileExtendName(content);  int picwidth,picheight,color;
  String piccolor;
  picwidth = 0;
  picheight = 0;
  color = 0;
  piccolor = null;  if (picextendname.equals("GIF"))
  {
   //picwidth position
   picwidth = getFileAttribute(content,7,2,picextendname); 
   //picheight position
   picheight = getFileAttribute(content,9,2,picextendname);
   //piccolor position
   color = getFileAttribute(content,10,1,picextendname);
   color = color % 8 + 1;
   piccolor = getPicColor(color);
  }
  if (picextendname.equals("JPG"))
  {
   //考虑了两种情况
   picwidth = getFileAttribute(content,166,2,picextendname);
   picheight = getFileAttribute(content,164,2,picextendname);
   color = getFileAttribute(content,167,1,picextendname);
   color = color * 8;
   if ((picwidth == 0 )||(picheight == 0)||(Color > 3))
   {
    picwidth = getFileAttribute(content,197,2,picextendname);
    picheight = getFileAttribute(content,195,2,picextendname);
    color = getFileAttribute(content,198,1,picextendname);
    color = color * 8;
   }
   piccolor = getPicColor(color);
  }
  if (picextendname.equals("BMP"))
  {
   picwidth = getFileAttribute(content,19,2,picextendname);
   picheight = getFileAttribute(content,23,2,picextendname);
   color = getFileAttribute(content,28,1,picextendname);
   piccolor = getPicColor(color);
  }
  if (picextendname.equals("PNG"))
  {
   picwidth = getFileAttribute(content,19,2,picextendname);
   picheight = getFileAttribute(content,23,2,picextendname);
   // usually is "16M"??
   piccolor = "16M";
  }  model.setpicsExtendName(picextendname);
  model.setpicsWidth(picwidth);
  model.setpicsHeight(picheight);
  model.setpicsColor(piccolor);  return model;
 } private static byte[] readFromFile(String fileName) throws IOException
 {
  PicsModel model = null;
  FileInputStream fin = new FileInputStream(fileName);
  byte [] buf = new byte[fin.available()];
  fin.read(buf);
  fin.close();
  return buf;
 } private static String getFileExtendName(byte[] byte1)
 {
  String strFileExtendName;
  strFileExtendName = null;  //header bytes contains GIF87a or GIF89a?
  if ((byte1[0] == 71)&&(byte1[1] == 73)&&(byte1[2] == 70)&&(byte1[3] == 56)&&((byte1[4] == 55)||(byte1[4] == 57))&&(byte1[5] == 97))
  {
   strFileExtendName = "GIF";
  }
  //header bytes contains JFIF?
  if ((byte1[6] == 74)&&(byte1[7] == 70)&&(byte1[8] == 73)&&(byte1[9] == 70))
  {
   strFileExtendName = "JPG";
  }
  //header bytes contains BM?
  if ((byte1[0] == 66)&&(byte1[1] == 77))
  {
   strFileExtendName = "BMP";
  }
  //header bytes contains PNG?
  if ((byte1[1] == 80)&&(byte1[2] == 78)&&(byte1[3] == 71))
  {
   strFileExtendName = "PNG";
  }  return strFileExtendName;
 }

解决方案 »

  1.   

    private static int getFileAttribute(byte[] byte2,int n,int m,String fileextendname)
     {
      int j,FileAttributeValue;
      j = 0;
      FileAttributeValue = 0;
      String str,str1;
      str = "";
      str1 = "";  //如果其大于127,则反之出现少于0,需要进行+256运算
      for (int k = 0; k < m; k ++)
      {
       if (byte2[n-k] < 0)
       {
        j = byte2[n-k];
        j = j + 256;
       }
       else
       {
        j = byte2[n-k];
       }   str1 = Integer.toHexString(j);
       //转化为16进制,不足位补0
       if (str1.length() < 2)
       {
        str1 = "0" + str1;
       }   //格式的不同,表达属性的字节也有变化
       if(fileextendname.equalsIgnoreCase("JPG")||fileextendname.equalsIgnoreCase("PNG"))
       {
        str = str1 + str;
       }
       else
       {
        str = str + str1;
       }
      }  FileAttributeValue = HexToDec(str);
      return FileAttributeValue;
     } private static int HexToDec(String cadhex)
     {
      int n, i, j,k,decimal;
      String CADHEX1;
      n = 0;
      i = 0;
      j = 0;
      k = 0;
      decimal = 0;
      CADHEX1 = null;
      n =cadhex.length();
      CADHEX1 = cadhex.trim().toUpperCase();  while(i < n)
      {
       j = CADHEX1.charAt(i);
       if ((j >= 48) && (j < 65))
       {
        j = j - 48;
       }
       if (j >= 65)
       {
        j = j - 55;
       }
       i = i + 1;   //16幂运算
       k = 1;
       for (int m = 0; m < (n-i); m ++)
       {
        k = 16 * k;
       }
       decimal = j*k + decimal;
      }  return decimal;
     } private static String getPicColor(int color)
     {
      int k;
      k = 1;
      String piccolor;
      piccolor = null;
      //2幂运算
      for (int m = 0; m < color; m ++)
      {
       k = 2 * k;
      }  Integer kk;
      kk = null;
      if (k >= 1048576)
      {
       k = k / 1048576;
       kk = new Integer(k);
       piccolor = kk.toString() + "M";
      }
      else if (k >= 1024)
      {
       k = k / 1024;
       kk = new Integer(k);
       piccolor = kk.toString() + "K";
      }
      else if (k > 0)
      {
       kk = new Integer(k);
       piccolor = kk.toString();
      }  return piccolor;
     }}
      

  2.   

    http://www.yesky.com/SoftChannel/72342371961929728/20031226/1757226.shtml
      

  3.   

    java不支持bmp真是有点头疼,要这么麻烦
      

  4.   

    BMP的某几个字节的信息就是图片的高和宽,你可以查查资料,把相应字节读出就行了
      

  5.   

    前段时间刚找出来的
    public static Image loadbitmap(String fileName)
        {
            //Image image;
            System.out.println("loading:" + fileName);
            try
            {
                FileInputStream fs = new FileInputStream(fileName);
                int bflen = 14; // 14 字节 BITMAPFILEHEADER
                byte bf[] = new byte[bflen];
                fs.read(bf, 0, bflen);
                int bilen = 40; // 40 字节 BITMAPINFOHEADER
                byte bi[] = new byte[bilen];
                fs.read(bi, 0, bilen);            // 解释数据。
                /*int nsize = (((int)bf[5]&0xff)<<24)
                    | (((int)bf[4]&0xff)<<16)
                    | (((int)bf[3]&0xff)<<8)
                    | (int)bf[2]&0xff;
                     System.out.println("File type is :"+(char)bf[0]+(char)bf[1]);
                             System.out.println("Size of file is :"+nsize);
                             int nbisize = (((int)bi[3]&0xff)<<24)
                    | (((int)bi[2]&0xff)<<16)
                    | (((int)bi[1]&0xff)<<8)
                    | (int)bi[0]&0xff;
                     System.out.println("Size of bitmapinfoheader is :"+nbisize);*/            int nwidth = ( ( (int) bi[7] & 0xff) << 24)
                    | ( ( (int) bi[6] & 0xff) << 16)
                    | ( ( (int) bi[5] & 0xff) << 8)
                    | (int) bi[4] & 0xff;
                System.out.println("Width is :" + nwidth);            int nheight = ( ( (int) bi[11] & 0xff) << 24)
                    | ( ( (int) bi[10] & 0xff) << 16)
                    | ( ( (int) bi[9] & 0xff) << 8)
                    | (int) bi[8] & 0xff;
                System.out.println("Height is :" + nheight);
            }
            catch (Exception e)
            {
                System.out.println("Caught exception in loadbitmap!");
            }
            return (Image)null;
        }