- 积分
- 39137
- 明经币
- 个
- 注册时间
- 2009-1-8
- 在线时间
- 小时
- 威望
-
- 金钱
- 个
- 贡献
-
- 激情
-
|
发表于 2014-7-22 12:23:56
|
显示全部楼层
llsheng_73 发表于 2014-7-21 02:59 
把command改为entmake是一方面,但还不能根本解决问题
一般情况下,不先插入图片不知道它的大小,所以不可 ...
也找了个模块。
 - '***************************************************
- '* 模 块 名:mdLSPicSize
- '* 功能描述:读取图片尺寸信息(不加载图片,支持PNG)
- '* 作 者:米兰
- '* 作者博客:http://www.millerlee.com
- '* 日 期:2012-01-21 21:39
- '* 版 本:V1.0.0
- '***************************************************
- '整行注释的为在读取图片尺寸时不需要的文件头信息
- 'BMP文件头
- Private Type BitmapFileHeader
- bfType As Integer '标识 0,1 两个字节为 42 4D 低位在前,即 19778
- bfReserved2 As Integer
- bfOffBits As Long
- bfReserved1 As Integer
- bfSize As Long
- End Type
- Private Type BitmapInfoHeader
- biSize As Long
- biWidth As Long '宽度 18,19,20,21 四个字节,低位在前
- biHeight As Long '高度 22,23,24,25 四个字节,低位在前
- ' biPlanes As Integer
- ' biBitCount As Integer
- ' biCompression As Long
- ' biSizeImage As Long
- ' biXPelsPerMeter As Long
- ' biYPelsPerMeter As Long
- ' biClrUsed As Long
- ' biClrImportant As Long
- End Type
- 'JPEG(这个好麻烦)
- Private Type LSJPEGHeader
- jSOI As Integer '图像开始标识 0,1 两个字节为 FF D8 低位在前,即 -9985
- jAPP0 As Integer 'APP0块标识 2,3 两个字节为 FF E0
- jAPP0Length(1) As Byte 'APP0块标识后的长度,两个字节,高位在前
- ' jJFIFName As Long 'JFIF标识 49(J) 48(F) 44(I) 52(F)
- ' jJFIFVer1 As Byte 'JFIF版本
- ' jJFIFVer2 As Byte 'JFIF版本
- ' jJFIFVer3 As Byte 'JFIF版本
- ' jJFIFUnit As Byte
- ' jJFIFX As Integer
- ' jJFIFY As Integer
- ' jJFIFsX As Byte
- ' jJFIFsY As Byte
- End Type
- Private Type LSJPEGChunk
- jcType As Integer '标识(按顺序):APPn(0,1~15)为 FF E1~FF EF; DQT为 FF DB(-9217)
- 'SOFn(0~3)为 FF C0(-16129),FF C1(-15873),FF C2(-15617),FF C3(-15361)
- 'DHT为 FF C4(-15105); 图像数据开始为 FF DA
- jcLength(1) As Byte '标识后的长度,两个字节,高位在前
- '若标识为SOFn,则读取以下信息;否则按照长度跳过,读下一块
- jBlock As Byte '数据采样块大小 08 or 0C or 10
- jHeight(1) As Byte '高度两个字节,高位在前
- jWidth(1) As Byte '宽度两个字节,高位在前
- ' jColorType As Byte '颜色类型 03,后跟9字节,然后是DHT
- End Type
- 'PNG文件头
- Private Type LSPNGHeader
- pType As Long '标识 0,1,2,3 四个字节为 89 50(P) 4E(N) 47(G) 低位在前,即 1196314761
- pType2 As Long '标识 4,5,6,7 四个字节为 0D 0A 1A 0A
- pIHDRLength As Long 'IHDR块标识后的长度,疑似固定 00 0D,高位在前,即 13
- pIHDRName As Long 'IHDR块标识 49(I) 48(H) 44(D) 52(R)
- pWidth(3) As Byte '宽度 16,17,18,19 四个字节,高位在前
- pHeight(3) As Byte '高度 20,21,22,23 四个字节,高位在前
- ' pBitDepth As Byte
- ' pColorType As Byte
- ' pCompress As Byte
- ' pFilter As Byte
- ' pInterlace As Byte
- End Type
- 'GIF文件头(这个好简单)
- Private Type LSGIFHeader
- gType1 As Long '标识 0,1,2,3 四个字节为 47(G) 49(I) 46(F) 38(8) 低位在前,即 944130375
- gType2 As Integer '版本 4,5 两个字节为 7a单幅静止图像9a若干幅图像形成连续动画
- gWidth As Integer '宽度 6,7 两个字节,低位在前
- gHeight As Integer '高度 8,9 两个字节,低位在前
- End Type
- Public Function PictureSize(ByVal picPath As String, ByRef Width As Long, ByRef Height As Long) As String
- Dim iFile As Integer
- Dim jpg As LSJPEGHeader
- Width = 0: Height = 0 '预输出:0 * 0
- If picPath = "" Then PictureSize = "null": Exit Function '文件路径为空
- If Dir(picPath) = "" Then PictureSize = "not exist": Exit Function '文件不存在
- PictureSize = "error" '预定义:出错
- iFile = FreeFile()
- Open picPath For Binary Access Read As #iFile
- Get #iFile, , jpg
- If jpg.jSOI = -9985 Then
- Dim jpg2 As LSJPEGChunk, pass As Long
- pass = 5 + jpg.jAPP0Length(0) * 256 + jpg.jAPP0Length(1) '高位在前的计算方法
- PictureSize = "JPEG error" 'JPEG分析出错
- Do
- Get #iFile, pass, jpg2
- If jpg2.jcType = -16129 Or jpg2.jcType = -15873 Or jpg2.jcType = -15617 Or jpg2.jcType = -15361 Then
- Width = jpg2.jWidth(0) * 256 + jpg2.jWidth(1)
- Height = jpg2.jHeight(0) * 256 + jpg2.jHeight(1)
- PictureSize = "JPEG" 'JPEG分析成功
- Exit Do
- End If
- pass = pass + jpg2.jcLength(0) * 256 + jpg2.jcLength(1) + 2
- Loop While jpg2.jcType <> -15105 'And pass < LOF(iFile)
- ElseIf jpg.jSOI = 19778 Then
- Dim bmp As BitmapInfoHeader
- Get #iFile, 15, bmp
- Width = bmp.biWidth
- Height = bmp.biHeight
- PictureSize = "BMP" 'BMP分析成功
- Else
- Dim png As LSPNGHeader
- Get #iFile, 1, png
- If png.pType = 1196314761 Then
- Width = png.pWidth(0) * 16777216 + png.pWidth(1) * 65536 + png.pWidth(2) * 256 + png.pWidth(3)
- Height = png.pHeight(0) * 16777216 + png.pHeight(1) * 65536 + png.pHeight(2) * 256 + png.pHeight(3)
- PictureSize = "PNG" 'PNG分析成功
- ElseIf png.pType = 944130375 Then
- Dim gif As LSGIFHeader
- Get #iFile, 1, gif
- Width = gif.gWidth
- Height = gif.gHeight
- PictureSize = "GIF" 'GIF分析成功
- Else
- PictureSize = "unknow" '文件类型未知
- End If
- End If
- Close #iFile
- End Function
- Sub test()
- Dim w As Long, h As Long
- Dim f As String
- Dim t As String
- f = ThisWorkbook.Path & "\a.png"
- t = PictureSize(f, w, h) '运行宏,w,h就是对应图片的width height
- End Sub
|
|