123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141 |
- $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
|