PowerBuilder 如何得到jpg文件的尺寸? a * b 形式[转]


前段时间有人发过的,自己测试下
-------------------------------------
$PBExportHeader$f_getpicturesize.srf
global type f_getpicturesize from function_object
end type

forward prototypes
global function integer f_getpicturesize (string as_filename, ref long al_picturewidth, ref long al_pictureheight)
end prototypes

global function integer f_getpicturesize (string as_filename, ref long al_picturewidth, ref long al_pictureheight);// 函数: 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
end function


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/flyloafer/archive/2006/05/18/744263.aspx
前段时间有人发过的,自己测试下
-------------------------------------
$PBExportHeader$f_getpicturesize.srf
global type f_getpicturesize from function_object
end type

forward prototypes
global function integer f_getpicturesize (string as_filename, ref long al_picturewidth, ref long al_pictureheight)
end prototypes

global function integer f_getpicturesize (string as_filename, ref long al_picturewidth, ref long al_pictureheight);//  函数:  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
end function


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/flyloafer/archive/2006/05/18/744263.aspx

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值