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 閱讀(1718) 評論(0)  編輯  收藏


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


          網站導航:
           
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統計

          公告

          我的知識Blog!

          常用鏈接

          留言簿(3)

          隨筆檔案

          文章檔案

          Image

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 阿巴嘎旗| 抚远县| 泸定县| 色达县| 齐齐哈尔市| 筠连县| 时尚| 靖宇县| 云霄县| 广昌县| 枣庄市| 登封市| 高密市| 曲周县| 雅江县| 新乡市| 涿鹿县| 拉萨市| 定远县| 尉犁县| 雅江县| 瑞金市| 正宁县| 扶沟县| 汽车| 通辽市| 丹江口市| 旬阳县| 大城县| 新干县| 通江县| 武定县| 静海县| 满洲里市| 确山县| 开封市| 常山县| 长丰县| 上虞市| 襄垣县| 阿勒泰市|