成人午夜激情影院,小视频免费在线观看,国产精品夜夜嗨,欧美日韩精品一区二区在线播放

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

  一、 基本概述

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

  二、 圖片相關信息說明

  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圖片因缺少相關資源文件未作色彩分析。


文章來源:yesky
 放生
 愚愛
 夠愛
 觸電
 白狐
 葬愛
 光榮
 畫心
 火花
 稻香
 小酒窩
 下雨天
 右手邊
 安靜了
 魔杰座
 你不像她
 邊做邊愛
 擦肩而過
 我的答鈴
 懷念過去
 等一分鐘
 放手去愛
 冰河時代
 你的承諾
 自由飛翔
 原諒我一次
 吻的太逼真
 左眼皮跳跳
 做你的愛人
 一定要愛你
 飛向別人的床
 愛上別人的人
 感動天感動地
 心在跳情在燒
 玫瑰花的葬禮
 有沒有人告訴你
 即使知道要見面
 愛上你是一個錯
 最后一次的溫柔
 愛上你是我的錯
 怎么會狠心傷害我
 不是因為寂寞才想
 親愛的那不是愛情
 難道愛一個人有錯
 寂寞的時候說愛我
主站蜘蛛池模板: 浮梁县| 三河市| 辉县市| 郸城县| 金溪县| 桃江县| 上饶市| 自治县| 万载县| 定南县| 修文县| 岑溪市| 淮南市| 香格里拉县| 安宁市| 高阳县| 泾川县| 宜州市| 安平县| 景谷| 淄博市| 塘沽区| 三河市| 建瓯市| 涞水县| 华容县| 东乌| 丽江市| 盐源县| 淳化县| 新宁县| 乌兰浩特市| 蒲江县| 双柏县| 青龙| 东阳市| 三穗县| 翼城县| 高密市| 和政县| 中江县|