关闭

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

955人阅读 评论(0) 收藏 举报

 

前段时间有人发过的,自己测试下
-------------------------------------
$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

转贴,还没来得及测试!!!

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:47696次
    • 积分:769
    • 等级:
    • 排名:千里之外
    • 原创:13篇
    • 转载:47篇
    • 译文:0篇
    • 评论:1条
    文章分类
    最新评论