$PBExportHeader$of_getpicturesize_h.srf global type of_getpicturesize_h from function_object end type forward prototypes global function long of_getpicturesize_h (string as_filename) end prototypes global function long of_getpicturesize_h (string as_filename);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 Long al_PictureWidth,al_PictureHeight //文件不存在 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 al_PictureHeight * 4 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 al_PictureHeight * 4 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 FileClose(li_File) RETURN al_PictureHeight * 4 ELSE FileClose(li_File) RETURN 0 END IF END IF return 0 end function