<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    java獲取圖片屬性程序

    Tags: java 圖片屬性

     一、 基本概述

      圖片的應用越來越深入到我們的日常生活中, 譬如目前盛行的短信業務和初露頭角的彩信業務等。因此,我們很有必要獲取圖片的字節數、格式、色彩數、寬度和高度等信息,以更好地在手機上達到完美的效果,滿足消費者的迫切需要,提高業務的終合競爭力。

      二、 圖片相關信息說明

      1、GIF圖片

      GIF圖片格式標識符為GIF87A/GIF89A兩種,但我們一般看到的GIF圖片后綴名均為"GIF"。利用UltraEdit軟件打開某個GIF圖片文件(例如178×42×32 GIF),你將會看到類似如下圖(1)的內容(注意要點擊那個"H"按鈕喲!)。其格式、寬度、高度和色彩數信息位置不變,而且也是連續一起的。其中,藍色框內的字符集顯示圖片格式信息,將十六進制的"47"轉換為十進制就是"71",即"G"的ASCII碼值,其余的依此類推,就將獲得"GIF89A",通過這種方式獲取圖片的格式比直接獲取圖片的后綴名要可靠的多。因其后綴名用戶可隨意更改;紅色框內每兩位分別顯示其寬度和高度信息,并從右往左讀取,則分別"00B2"和"002A",即十進制為"178"和"42",也就是圖片的寬度和高度;綠色部分顯示圖片的色彩信息,轉換十進制之后為"196",然后進行除"8"得余數為"4",最后將其加"1"并作為"2"的冪,最終就是"32",即"2^(196%8+1)=32"。【其它格式圖片參上】


    圖(1)

      2、JPG圖片

      JPG圖片格式標識符為"JFIF",而且其信息位置不變。但高度、寬度和色彩數信息位置不太確定,但他們是連續一起的。如下兩圖(2)[例如761×150×16M JPG]和圖(3)[例如1984×1384×16M JPG]所示,并且不止這兩種情況。現就圖(2)作一些補充說明:紅色框內每兩位分別顯示其高度和寬度信息,并從左往右讀取,則分別為"0096"和"02F9",即十進制為"150"和"761",也就是圖片的高度和寬度;綠色部分顯示圖片的色彩信息,轉換十進制之后為"03",然后進行乘以"8"得"24",最后將其作為"2"的冪,最終就是"16M",即"2^(3*8+1)=16M"。不過,好像JPG圖片的色彩數一般都是"16M"?!


    圖(2)


     圖(3)

      注意:為了避免上述多種的情況的發生,從而導致我們處理非常麻煩,本人發現一個小小的技巧。利用Win操作系統自帶的畫圖工具打開"JPG"文件,之后,不需作任何改變,只要保存替換即可。這時一個戲劇性的變化出來了,其高度、寬度和色彩數信息位置都變得跟圖(2)類似,即圖(4)是由圖(3)變化二來的。


    圖(4)

      3、BMP圖片

      BMP圖片格式標識符為"BM",但其格式、寬度、高度和色彩數信息位置不變,但寬度、高度和色彩數信息位置是不連續的。如下圖(5)[例如352×288×16M BMP]所示。現就圖(5)作一些補充說明:紅色框內每兩位分別顯示其寬度和高度信息,并從右往左讀取,則分別為"0160"和"0120",即十進制為"352"和"288",也就是圖片的寬度和高度;綠色部分顯示圖片的色彩信息,轉換十進制之后為"24",然后將其作為"2"的冪,最終就是"16M",即"2^(24)=16M"。


    圖(5)

      4、PNG圖片

      PNG圖片格式標識符為"PNG",但其格式、寬度和高度信息位置不變,但寬度和高度信息位置是不連續的。如下圖(6)[例如18×16×16M PNG]所示。由于其跟BMP圖片非常相似,故不作重復說明。

      三、 源代碼及其說明

      源代碼由兩部分組成,即兩個文件組成。其一為"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;
     }

     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;
     }

    }

      四、 后記

      以上源代碼在Win 2k和Jbuilder 7等環境下正常運行過。由于時間關系,該程序目前只支持GIF(有87A/89A兩種格式)、JPG、PNG和BMP格式。另外,對于PNG圖片因缺少相關資源文件未作色彩分析。

    posted on 2008-04-25 14:31 Jarod.cn.LuLuLife 閱讀(1717) 評論(0)  編輯  收藏


    只有注冊用戶登錄后才能發表評論。


    網站導航:
     
    <2025年5月>
    27282930123
    45678910
    11121314151617
    18192021222324
    25262728293031
    1234567

    導航

    統計

    公告

    我的知識Blog!

    常用鏈接

    留言簿(3)

    隨筆檔案

    文章檔案

    Image

    搜索

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲精品天堂无码中文字幕| 亚洲午夜福利AV一区二区无码| 久久成人国产精品免费软件| 久9久9精品免费观看| 久久精品成人免费看| 久久国产乱子伦精品免费看| 久久精品免费视频观看| 97精品免费视频| 在线看片v免费观看视频777 | 亚洲精品电影天堂网| 亚洲美女自拍视频| 亚洲国产成人久久综合一区| 亚洲一区二区三区不卡在线播放| 激情亚洲一区国产精品| 亚洲AV日韩综合一区尤物| 亚洲AV永久无码精品放毛片| 亚洲av无码专区亚洲av不卡| 免费无码专区毛片高潮喷水 | 亚洲欧洲国产综合| 亚洲av乱码一区二区三区香蕉| 亚洲无人区码一二三码区别图片| 亚洲天堂免费在线| 看亚洲a级一级毛片| 五月天国产成人AV免费观看| a级毛片在线免费| 99国产精品免费观看视频| 国产在线观看片a免费观看| 免费观看毛片视频| 亚洲无码高清在线观看| 亚洲第一AV网站| 亚洲一区在线视频观看| 国产精品亚洲专区无码不卡| 国产人成网在线播放VA免费| 一区二区免费视频| 波多野结衣久久高清免费 | 亚洲AV无码专区日韩| 亚洲色偷偷偷鲁综合| 亚洲福利视频网址| 婷婷亚洲综合五月天小说在线| 一级特黄录像免费播放中文版| 久久免费视频观看|