of_getpicturesize_h.srf 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141
  1. $PBExportHeader$of_getpicturesize_h.srf
  2. global type of_getpicturesize_h from function_object
  3. end type
  4. forward prototypes
  5. global function long of_getpicturesize_h (string as_filename)
  6. end prototypes
  7. global function long of_getpicturesize_h (string as_filename);Integer li_File, li_DataRead
  8. Blob lb_Data
  9. Long ll_FileLength,ll_PictureWidth,ll_PictureHeight
  10. Long ll_DataLen,ll_DataPos,ll_FilePos
  11. Boolean lb_LoopFlag = TRUE
  12. Char lc_Char1,lc_Char2
  13. Long al_PictureWidth,al_PictureHeight
  14. //文件不存在
  15. IF NOT FileExists(as_FileName) THEN RETURN 0
  16. //取文件大小
  17. ll_FileLength = FileLength(as_FileName)
  18. //打开文件
  19. li_File = FileOpen(as_FileName,StreamMode!)
  20. IF li_File = -1 THEN RETURN 0
  21. //读取文件
  22. li_DataRead = FileRead(li_File,lb_Data)
  23. IF li_DataRead <= 0 THEN
  24. FileClose(li_File)
  25. RETURN 0
  26. END IF
  27. // GIF目前主要有两种类型
  28. // 1. 标识为GIF87a, 只是用来存储单幅静止图像
  29. // 2. 标识为GIF89a, 可以同时存储若干幅静止图像并进而形成连续的动画
  30. // 文件的前 6 个字节为标识:GIF87a 或 GIF89a, 第 7,8 字节为图像宽度(width),
  31. // 第 9,10 字节为图像高度(height), 注意两个字节中低位在前
  32. // GIF 文件格式判断
  33. IF String(BlobMid(lb_Data,1,4)) = 'GIF8' THEN
  34. ll_PictureWidth = Asc(String(BlobMid(lb_Data,7,1))) + Asc(String(BlobMid(lb_Data,8,1))) * 256
  35. ll_PictureHeight = Asc(String(BlobMid(lb_Data,9,1))) + Asc(String(BlobMid(lb_Data,10,1))) * 256
  36. IF ll_PictureWidth > 0 AND ll_PictureHeight > 0 THEN
  37. al_PictureWidth = ll_PictureWidth
  38. al_PictureHeight = ll_PictureHeight
  39. FileClose(li_File)
  40. RETURN al_PictureHeight * 4
  41. ELSE
  42. FileClose(li_File)
  43. RETURN 0
  44. END IF
  45. END IF
  46. // JPEG文件格式
  47. // 前 3 个字节为标识: 0xFF,0xD8,0xFF
  48. IF String(BlobMid(lb_Data,1,3)) = Char(255) + Char(216) + Char(255) THEN
  49. ll_DataLen = Len(lb_Data)
  50. ll_DataPos = 3
  51. ll_FilePos = 3
  52. DO WHILE lb_LoopFlag
  53. ll_DataPos = ll_DataPos + 1
  54. ll_FilePos = ll_FilePos + 1
  55. lc_Char1 = String(BlobMid(lb_Data,ll_DataPos,1))
  56. lc_Char2 = String(BlobMid(lb_Data,ll_DataPos + 1,1))
  57. IF lc_Char1 = Char(255) AND lc_Char2 <> Char(255) THEN
  58. IF lc_Char2 >= Char(192) AND lc_Char2 <= Char(195) THEN
  59. //找到尺寸数据
  60. ll_PictureWidth = Asc(String(BlobMid(lb_Data,ll_DataPos + 7,1))) * 256 + Asc(String(BlobMid(lb_Data,ll_DataPos + 8,1)))
  61. ll_PictureHeight = Asc(String(BlobMid(lb_Data,ll_DataPos + 5,1))) * 256 + Asc(String(BlobMid(lb_Data,ll_DataPos + 6,1)))
  62. lb_LoopFlag = FALSE
  63. ELSE
  64. //没有找到尺寸数据,重新读取文件
  65. ll_FilePos = ll_FilePos + Asc(String(BlobMid(lb_Data,ll_DataPos + 3,1))) * 256 + Asc(String(BlobMid(lb_Data,ll_DataPos + 2,1))) + 1
  66. IF ll_FilePos > ll_FileLength THEN
  67. FileClose(li_File)
  68. RETURN 0
  69. ELSE
  70. FileSeek(li_File,ll_FilePos)
  71. FileRead(li_File,lb_Data)
  72. ll_DataLen = Len(lb_Data)
  73. ll_DataPos = 0
  74. END IF
  75. END IF
  76. END IF
  77. IF ll_DataPos = ll_DataLen - 9 AND lb_LoopFlag = TRUE THEN
  78. ll_FilePos = ll_FilePos - 9
  79. FileSeek(li_File,ll_FilePos)
  80. FileRead(li_File,lb_Data)
  81. ll_DataLen = Len(lb_Data)
  82. ll_DataPos = 0
  83. END IF
  84. IF ll_FilePos >= ll_FileLength THEN
  85. lb_LoopFlag = FALSE
  86. END IF
  87. LOOP
  88. IF ll_PictureWidth > 0 AND ll_PictureHeight > 0 THEN
  89. al_PictureWidth = ll_PictureWidth
  90. al_PictureHeight = ll_PictureHeight
  91. FileClose(li_File)
  92. RETURN al_PictureHeight * 4
  93. ELSE
  94. FileClose(li_File)
  95. RETURN 0
  96. END IF
  97. END IF
  98. // BMP文件格式
  99. // 前两个字节是标识:标识可能有很多种
  100. // 第 19,20,21,22 字节为宽度(width), 第 23,24,25,26 字节为高度(height)
  101. // 四个字节组成dword, 低位在前
  102. IF String(BlobMid(lb_Data,1,2)) = 'BM' THEN
  103. 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
  104. 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
  105. IF ll_PictureWidth > 0 AND ll_PictureHeight > 0 THEN
  106. al_PictureWidth = ll_PictureWidth
  107. al_PictureHeight = ll_PictureHeight
  108. FileClose(li_File)
  109. RETURN al_PictureHeight * 4
  110. ELSE
  111. FileClose(li_File)
  112. RETURN 0
  113. END IF
  114. END IF
  115. return 0
  116. end function