Geo-Web

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
'''<summary>
''' 不打开图片获取图片大小
'''</summary>
'''<param name="filename"></param>
'''<param name="w"></param>
'''<param name="h"></param>
'''<remarks>http://bbs.pfan.cn/post-323575.html</remarks>
Public Shared Sub GetImageSize(ByVal filename As String, <Out()> ByRef w As Integer, <Out()> ByRef h As Integer)
Dim k As Long, H1 As Byte, H2 As Byte, W1 As Byte, W2 As Byte
Dim binReader As New BinaryReader(File.Open(filename, FileMode.Open))
H1 = binReader.ReadByte()
H2 = binReader.ReadByte()
W1 = binReader.ReadByte()
W2 = binReader.ReadByte()

If H1 = 255 AndAlso H2 = 216 Then 'jpg
k = 3
Do
binReader.BaseStream.Seek(k - 1, SeekOrigin.Begin)
H1 = binReader.ReadByte()
H2 = binReader.ReadByte()
W1 = binReader.ReadByte()
W2 = binReader.ReadByte()

k = k + 2 + W2 + W1 * 256
Loop Until H1 = 255 And H2 = 192
H1 = binReader.ReadByte() '每个样本位数,舍弃
H1 = binReader.ReadByte()
H2 = binReader.ReadByte()
W1 = binReader.ReadByte()
W2 = binReader.ReadByte()
ElseIf H1 = 0 AndAlso H2 = 0 AndAlso W1 = 1 Then 'icon
binReader.BaseStream.Seek(7 - 1, SeekOrigin.Begin)
W2 = binReader.ReadByte()
H2 = binReader.ReadByte()
W1 = 0 : H1 = 0
ElseIf H1 = 66 AndAlso H2 = 77 Then 'bmp
binReader.BaseStream.Seek(19 - 1, SeekOrigin.Begin)
W2 = binReader.ReadByte()
W1 = binReader.ReadByte()
binReader.BaseStream.Seek(23 - 1, SeekOrigin.Begin)
H2 = binReader.ReadByte()
H1 = binReader.ReadByte()
ElseIf H1 = 71 AndAlso H2 = 73 AndAlso W1 = 70 Then 'gif
binReader.BaseStream.Seek(7 - 1, SeekOrigin.Begin)
W2 = binReader.ReadByte()
W1 = binReader.ReadByte()
H2 = binReader.ReadByte()
H1 = binReader.ReadByte()
ElseIf H1 = 137 AndAlso H2 = 80 AndAlso W1 = 78 AndAlso W2 = 71 Then 'png
binReader.BaseStream.Seek(19 - 1, SeekOrigin.Begin)
W1 = binReader.ReadByte()
W2 = binReader.ReadByte()
binReader.BaseStream.Seek(23 - 1, SeekOrigin.Begin)
H1 = binReader.ReadByte()
H2 = binReader.ReadByte()
ElseIf H1 = 215 AndAlso H2 = 205 AndAlso W1 = 198 AndAlso W2 = 154 Then 'wmf
Dim L As Integer, R As Integer, T As Integer, B As Integer
binReader.BaseStream.Seek(7 - 1, SeekOrigin.Begin)
L = binReader.ReadInt32
T = binReader.ReadInt32()
R = binReader.ReadInt32()
B = binReader.ReadInt32()
L = R - L : T = B - T
W2 = L Mod 256 : W1 = L \ 256 : H2 = T Mod 256 : H1 = T \ 256
ElseIf (H1 = 77 AndAlso H2 = 77) OrElse (H1 = 73 AndAlso H2 = 73) Then 'tif
Dim de As Integer, t1 As Integer, t2 As Long
t2 = binReader.ReadInt64() '获取第一个IFD的偏移量

binReader.BaseStream.Seek(t2, SeekOrigin.Begin) '获取第一个IFD中DE的数量

For i = 1 To de
t1 = binReader.ReadInt32 '获取属性的标签编号

If t1 = 256 Then '如果是图像宽
t1 = binReader.ReadInt32 '废弃
t2 = binReader.ReadInt64 '废弃
W2 = binReader.ReadByte
W1 = binReader.ReadByte
t1 = binReader.ReadInt32 '废弃

k = k + 1
ElseIf t1 = 257 Then '如果是图像高
t1 = binReader.ReadInt32 '废弃
t2 = binReader.ReadInt64 '废弃
H2 = binReader.ReadByte
H1 = binReader.ReadByte
t1 = binReader.ReadInt32 '废弃
k = k + 1
Else '否则这些数据废弃
t1 = binReader.ReadInt32
t2 = binReader.ReadInt64
t2 = binReader.ReadInt64
End If
If k = 2 Then Exit For
Next i
Else
Exit Sub
End If

w = W1 * 256 + W2
h = H1 * 256 + H2

End Sub

参考:http://bbs.pfan.cn/post-323575.html

只有jpg和png测试过,其他不能保证正确,可以参考原文改进。

posted on 2011-11-17 18:25  Geo-Web  阅读(596)  评论(0编辑  收藏  举报