pb中获取图片尺寸,通过读取头文件的方式

pb中获取图片尺寸,通过读取头文件的方式,为什么有的可以读取到,有的不行呢?同样是jpeg文件!
$PBExportHeader$of_getpicturesize.srf
global type of_getpicturesize from function_object
end type

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

global function integer of_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   
  byte 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 = byte(BlobMid(lb_Data,7,1)) + byte(BlobMid(lb_Data,8,1)) * 256   
ll_PictureHeight = byte(BlobMid(lb_Data,9,1)) + byte(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   
  // messagebox("ll_DataPos",ll_DataPos);
  //If BlobMid(lb_Data,1,3) = Char(255)+Char(216)+Char(255) Then
if byte(BlobMid(lb_Data,1,1)) = 255 and byte(BlobMid(lb_Data,2,1)) = 216 and byte(BlobMid(lb_Data,3,1)) = 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 = byte(BlobMid(lb_Data,ll_DataPos,1));
lc_Char2 = byte(BlobMid(lb_Data,ll_DataPos+1,1));
//messagebox("ll_DataPos2",ll_DataPos);
If lc_Char1= 255 And lc_Char2 <> 255 Then
If lc_Char2 >= 192 And lc_Char2 <= 195 Then
//找到尺寸数据
ll_PictureWidth= byte(BlobMid(lb_Data,ll_DataPos+7,1))*256+byte(BlobMid(lb_Data,ll_DataPos+8,1));
ll_PictureHeight= byte(BlobMid(lb_Data,ll_DataPos+5,1))*256 + byte(BlobMid(lb_Data,ll_DataPos+6,1));
lb_LoopFlag= False;
Else   
//没有找到尺寸数据,重新读取文件
// messagebox(" byte(BlobMid(lb_Data,ll_DataPos+3,1))", byte(BlobMid(lb_Data,ll_DataPos+ 3,1)));
//messagebox(" byte(BlobMid(lb_Data,ll_DataPos+2,1))", byte(BlobMid(lb_Data,ll_DataPos + 2,1)));
//ll_FilePos = ll_FilePos + byte(BlobMid(lb_Data,ll_DataPos+ 3,1)) * 256 + byte(BlobMid(lb_Data,ll_DataPos+ 2,1)) + 1;
ll_FilePos = ll_FilePos + byte(BlobMid(lb_Data,ll_DataPos+ 3,1)) + byte(BlobMid(lb_Data,ll_DataPos+ 2,1)) + 1;
// messagebox("ll_FilePos",ll_FilePos);
// messagebox("ll_FileLength",ll_FileLength);
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
  if byte(BlobMid(lb_Data,1,1)) = asc('B') and byte(BlobMid(lb_Data,2,1)) = asc('M') then
ll_PictureWidth = byte(BlobMid(lb_Data,19,1)) + byte(BlobMid(lb_Data,20,1)) * 256 + byte(BlobMid(lb_Data,21,1)) * 65536 + byte(BlobMid(lb_Data,22,1)) * 16777216   
ll_PictureHeight = byte(BlobMid(lb_Data,23,1)) + byte(BlobMid(lb_Data,24,1)) * 256 + byte(BlobMid(lb_Data,25,1)) * 65536 + byte(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

posted @   levin_jian  阅读(713)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示