當前位置:首頁>>軟件教程>>新聞內(nèi)容  
JBuilder設計獲取圖片屬性程序
作者:何凱 發(fā)布時間:2003-12-28 16:52:32 | 【字體:

  一、 基本概述

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

  二、 圖片相關(guān)信息說明

  1、GIF圖片

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


圖(1)

  2、JPG圖片

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


圖(2)


 圖(3)

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


圖(4)

  3、BMP圖片

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


圖(5)

  4、PNG圖片

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


圖(6)

  三、 源代碼及其說明

  源代碼由兩部分組成,即兩個文件組成。其一為"PicsModel.java",主要存儲圖片的相關(guān)信息;其二位"readpic.java",獲取圖片的相關(guān)信息,是本文的重點所在。詳細代碼如下:

  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;
   //不想處理的話,請直接獲取其字節(jié)數(shù)
   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,則反之出現(xiàn)少于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);
   //轉(zhuǎn)化為16進制,不足位補0
   if (str1.length() < 2)
   {
    str1 = "0" + str1;
   }

   //格式的不同,表達屬性的字節(jié)也有變化
   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等環(huán)境下正常運行過。由于時間關(guān)系,該程序目前只支持GIF(有87A/89A兩種格式)、JPG、PNG和BMP格式。另外,對于PNG圖片因缺少相關(guān)資源文件未作色彩分析。


文章來源:yesky
 放生
 愚愛
 夠愛
 觸電
 白狐
 葬愛
 光榮
 畫心
 火花
 稻香
 小酒窩
 下雨天
 右手邊
 安靜了
 魔杰座
 你不像她
 邊做邊愛
 擦肩而過
 我的答鈴
 懷念過去
 等一分鐘
 放手去愛
 冰河時代
 你的承諾
 自由飛翔
 原諒我一次
 吻的太逼真
 左眼皮跳跳
 做你的愛人
 一定要愛你
 飛向別人的床
 愛上別人的人
 感動天感動地
 心在跳情在燒
 玫瑰花的葬禮
 有沒有人告訴你
 即使知道要見面
 愛上你是一個錯
 最后一次的溫柔
 愛上你是我的錯
 怎么會狠心傷害我
 不是因為寂寞才想
 親愛的那不是愛情
 難道愛一個人有錯
 寂寞的時候說愛我