獲得圖片檔案的映像尺寸大小

來源:互聯網
上載者:User
//====================================================================
//   函數:   of_getpicturesize()
//--------------------------------------------------------------------
//   描述:   獲得圖片檔案的映像尺寸大小(支援GIF,JPG,BMP格式)
//--------------------------------------------------------------------
//   參數:  
// value         string as_FileName           圖片檔案名稱
// reference long     al_PictureWidth   返回圖片寬度
// reference long     al_PictureHeight 返回圖片高度
//--------------------------------------------------------------------
//   傳回值:     integer 1   -   成功,0   -   失敗
//--------------------------------------------------------------------

Integer   li_File,   li_DataRead
Blob   lb_Data
Long   ll_FileLength,ll_PictureWidth,ll_PictureHeight
Long   ll_DataLen,ll_DataPos,ll_FilePos
Boolean   lb_LoopFlag   =   True
Char   lc_Char1,lc_Char2

//檔案不存在
If   Not   FileExists(as_FileName)   Then   Return   0

//取檔案大小
ll_FileLength   =   FileLength(as_FileName)

//開啟檔案
li_File   =   FileOpen(as_FileName,StreamMode!)
If   li_File   =   -1   Then   Return   0

//讀取檔案
li_DataRead   =   FileRead(li_File,lb_Data)
If   li_DataRead   <=   0   Then
FileClose(li_File)
Return   0
End   If

//   GIF目前主要有兩種類型
//   1.   標識為GIF87a,   只是用來儲存單幅靜止映像
//   2.   標識為GIF89a,   可以同時儲存若干幅靜止映像並進而形成連續的動畫
//   檔案的前   6   個位元組為標識:GIF87a   或   GIF89a,   第   7,8   位元組為映像寬度(width),  
//   第   9,10   位元組為映像高度(height),   注意兩個位元組中低位在前

//   GIF   檔案格式判斷
If   String(BlobMid(lb_Data,1,4))   =   'GIF8'   Then
ll_PictureWidth   =   Asc(String(BlobMid(lb_Data,7,1)))   +   Asc(String(BlobMid(lb_Data,8,1)))   *  

256
ll_PictureHeight   =   Asc(String(BlobMid(lb_Data,9,1)))   +   Asc(String(BlobMid(lb_Data,10,1)))  

*   256
If   ll_PictureWidth   >   0   And   ll_PictureHeight   >   0   Then
al_PictureWidth   =   ll_PictureWidth
al_PictureHeight   =   ll_PictureHeight
FileClose(li_File)
Return   1
Else
FileClose(li_File)
Return   0
End   If
End   If

//   JPEG檔案格式
//   前   3   個位元組為標識:   0xFF,0xD8,0xFF
If   String(BlobMid(lb_Data,1,3))   =   Char(255)   +   Char(216)   +   Char(255)   Then
ll_DataLen   =   Len(lb_Data)
ll_DataPos   =   3
ll_FilePos   =   3
Do   While   lb_LoopFlag
ll_DataPos   =   ll_DataPos   +   1
ll_FilePos   =   ll_FilePos   +   1
lc_Char1   =   String(BlobMid(lb_Data,ll_DataPos,1))
lc_Char2   =   String(BlobMid(lb_Data,ll_DataPos   +   1,1))
If   lc_Char1   =   Char(255)   And   lc_Char2   <>   Char(255)   Then
If   lc_Char2   >=   Char(192)   And   lc_Char2   <=   Char(195)   Then
//找到尺寸資料
ll_PictureWidth   =   Asc(String(BlobMid(lb_Data,ll_DataPos   +   7,1)))   *  

256   +   Asc(String(BlobMid(lb_Data,ll_DataPos   +   8,1)))
ll_PictureHeight   =   Asc(String(BlobMid(lb_Data,ll_DataPos   +   5,1)))  

*   256   +   Asc(String(BlobMid(lb_Data,ll_DataPos   +   6,1)))
lb_LoopFlag   =   False
Else
//沒有找到尺寸資料,重新讀取檔案
ll_FilePos   =   ll_FilePos   +   Asc(String(BlobMid(lb_Data,ll_DataPos   +  

3,1)))   *   256   +   Asc(String(BlobMid(lb_Data,ll_DataPos   +   2,1)))   +   1
If   ll_FilePos   >   ll_FileLength   Then
FileClose(li_File)
Return   0
Else
FileSeek(li_File,ll_FilePos)
FileRead(li_File,lb_Data)
ll_DataLen   =   Len(lb_Data)
ll_DataPos   =   0
End   If
End   If
End   If
If   ll_DataPos   =   ll_DataLen   -   9   And   lb_LoopFlag   =   True   Then
ll_FilePos   =   ll_FilePos   -   9
FileSeek(li_File,ll_FilePos)
FileRead(li_File,lb_Data)
ll_DataLen   =   Len(lb_Data)
ll_DataPos   =   0
End   If
If   ll_FilePos   >=   ll_FileLength   Then
lb_LoopFlag   =   False
End   If
Loop
If   ll_PictureWidth   >   0   And   ll_PictureHeight   >   0   Then
al_PictureWidth   =   ll_PictureWidth
al_PictureHeight   =   ll_PictureHeight
FileClose(li_File)
Return   1
Else
FileClose(li_File)
Return   0
End   If
End   If

//   BMP檔案格式
//   前兩個位元組是標識:標識可能有很多種
//   第   19,20,21,22   位元組為寬度(width),   第   23,24,25,26   位元組為高度(height)
//   四個位元組組成dword,   低位在前
If   String(BlobMid(lb_Data,1,2))   =   'BM'   Then
ll_PictureWidth   =   Asc(String(BlobMid(lb_Data,19,1)))   +   Asc(String(BlobMid(lb_Data,20,1)))  

*   256   +   Asc(String(BlobMid(lb_Data,21,1)))   *   65536   +   Asc(String(BlobMid(lb_Data,22,1)))   *   16777216
ll_PictureHeight   =   Asc(String(BlobMid(lb_Data,23,1)))   +   Asc(String(BlobMid(lb_Data,24,1)))  

*   256   +   Asc(String(BlobMid(lb_Data,25,1)))   *   65536   +   Asc(String(BlobMid(lb_Data,26,1)))   *   16777216
If   ll_PictureWidth   >   0   And   ll_PictureHeight   >   0   Then
al_PictureWidth   =   ll_PictureWidth
al_PictureHeight   =   ll_PictureHeight
////將映像的真實大小轉換為PBUnit大小,並返回
//al_PictureWidth   =   PixelsToUnits(ll_PictureWidth,XPixelsToUnits!)
//al_PictureHeight   =   PixelsToUnits(ll_PictureHeight,YPixelsToUnits!)
FileClose(li_File)
Return   1
Else
FileClose(li_File)
Return   0
End   If
End   If

Return   0

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.