程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> 關於JAVA >> JBuilder設計獲取圖片屬性程序

JBuilder設計獲取圖片屬性程序

編輯:關於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圖片非常相似,故不作重復說明。

圖(6)

三、源代碼及其說明

源代碼由兩部分組成,即兩個文件組成。其一為"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圖片因缺少相關資源文件未作色彩分析。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved