ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > 我的酷贴 > Excel VBA > 将BMP图像导入Excel的程序

将BMP图像导入Excel的程序

作者:绿色风 分类: 时间:2022-08-18 浏览:129
楼主
amulee
研究了一天BMP图像格式,了解了一些基本信息。尝试着将BMP图片画入Excel工作簿,效果如图:

 
由于16位和32位图过于复杂,目前还不支持导入。
代码参考如下:
  1. '定义位图文件头信息类型
  2. Type BMPHeader
  3.     Header As String    '头信息
  4.     Size As Long        '文件大小
  5.     DataOffset As Long  '数据偏移
  6.     Width As Long       '宽
  7.     Height As Long      '高
  8.     Bit As Long         '图像位数
  9.     InfLen As Long      '信息头总长度
  10.     ColoPanLen As Long  '调色板长度
  11. End Type

  12. Sub Main()
  13.     Dim FS As Integer
  14.     Dim Temp As Byte
  15.     Dim FName As String
  16.     Dim BMPHd As BMPHeader
  17.     Dim ArrColor
  18.     Dim arrPoints
  19.     Dim i As Long
  20.     FName = ThisWorkbook.Path & "\ET 24BIT.BMP"
  21.     BMPHd = GetBmpHeader(FName)
  22.     Select Case BMPHd.Bit
  23.         Case 1
  24.             MsgBox "暂不支持"
  25.             Exit Sub
  26.         Case Is < 16
  27.             ArrColor = GetBmpRGBColor(FName, BMPHd.InfLen, BMPHd.ColoPanLen)
  28.             arrPoints = GetBmpPoints(FName, BMPHd.Width, BMPHd.Height, BMPHd.Bit, BMPHd.DataOffset, ArrColor)
  29.         Case 24
  30.             arrPoints = GetBmpPoints(FName, BMPHd.Width, BMPHd.Height, BMPHd.Bit, BMPHd.DataOffset)
  31.         Case Else
  32.             MsgBox "暂不支持"
  33.             Exit Sub
  34.     End Select
  35.     With Sheet4
  36.         .Cells.Interior.Color = xlNone
  37.         For i = 1 To UBound(arrPoints)
  38.             For j = 1 To UBound(arrPoints, 2)
  39.                 .Cells(j, i).Interior.Color = arrPoints(i, j)
  40.             Next j
  41.         Next i
  42.     End With
  43. End Sub

  44. '获取BMP头信息
  45. Function GetBmpHeader(ByVal FName As String) As BMPHeader
  46.     Dim Temp() As Byte
  47.     Dim FS As Integer
  48.     FS = FreeFile
  49.     '打开文件
  50.     Open FName For Binary Access Read As #FS
  51.         '文件头
  52.         GetFS Temp, 2, FS, 1
  53.         GetBmpHeader.Header = Chr(Temp(1)) & Chr(Temp(2))
  54.         '文件大小
  55.         GetFS Temp, 4, FS, 3
  56.         GetBmpHeader.Size = GetNumber(Temp)
  57.         '图像数据偏移量
  58.         GetFS Temp, 4, FS, 11
  59.         GetBmpHeader.DataOffset = GetNumber(Temp)
  60.         '图像宽度
  61.         GetFS Temp, 4, FS, 19
  62.         GetBmpHeader.Width = GetNumber(Temp)
  63.         '图像高度
  64.         GetFS Temp, 4, FS, 23
  65.         GetBmpHeader.Height = GetNumber(Temp)
  66.         '图像位数
  67.         GetFS Temp, 2, FS, 29
  68.         GetBmpHeader.Bit = GetNumber(Temp)
  69.         '信息头长度
  70.         GetFS Temp, 4, FS, 15
  71.         GetBmpHeader.InfLen = GetNumber(Temp) + 14
  72.         GetBmpHeader.ColoPanLen = GetBmpHeader.DataOffset - GetBmpHeader.InfLen
  73.     Close #FS
  74. End Function

  75. '获取调色板信息
  76. Function GetBmpRGBColor(ByVal FName As String, ByVal ColorOffset As Long, ByVal ColorLen As Long)
  77.     Dim Temp() As Byte
  78.     Dim ArrJG()
  79.     Dim Pos As Long
  80.     Dim EndPos As Long
  81.     Dim K As Long
  82.     Dim FS As Integer
  83.     ReDim ArrJG(ColorLen / 4 - 1)
  84.     '终点位置
  85.     EndPos = ColorOffset + ColorLen
  86.     FS = FreeFile
  87.     Open FName For Binary Access Read As #FS
  88.         '开始循环获取颜色
  89.         For Pos = ColorOffset + 1 To EndPos Step 4
  90.             '获取一个颜色数组
  91.             GetFS Temp, 4, FS, Pos
  92.             '添加颜色,并转换成RGB颜色
  93.             ArrJG(K) = RGB(Temp(3), Temp(2), Temp(1))
  94.             '计数累积
  95.             K = K + 1
  96.         Next
  97.     Close #FS
  98.     '结果输出
  99.     GetBmpRGBColor = ArrJG
  100. End Function

  101. Function GetBmpPoints(ByVal FName As String, ByVal FWidth As Long, ByVal FHeight As Long, _
  102.                     ByVal Bit As Long, ByVal DataOffset As Long, Optional ByVal ArrColor)
  103.     Dim ArrJG() As Long
  104.     Dim Pos As Long
  105.     Dim Temp() As Byte
  106.     Dim TempHex
  107.     Dim TempColor As Long
  108.     Dim FS As Integer
  109.     Dim Bln As Boolean
  110.     '定义数组大小
  111.     ReDim ArrJG(1 To FWidth, 1 To FHeight)
  112.     FS = FreeFile
  113.     Select Case Bit
  114.         '处理16色图
  115.         Case 4
  116.             Open FName For Binary Access Read As #FS
  117.             '初始位置
  118.             Pos = DataOffset + 1
  119.             For j = FHeight To 1 Step -1
  120.                 For i = 1 To FWidth
  121.                     '如果未读取则执行读取
  122.                     If Not Bln Then
  123.                         '读取一个数据
  124.                         GetFS Temp, 1, FS, Pos
  125.                         '该数据包含两个点。读取第一个点
  126.                         TempHex = WorksheetFunction.Dec2Hex(Temp(1), 2)
  127.                         TempColor = ArrColor(WorksheetFunction.Hex2Dec(Left(TempHex, 1)))
  128.                         Bln = True
  129.                     Else
  130.                         TempColor = ArrColor(WorksheetFunction.Hex2Dec(Right(TempHex, 1)))
  131.                         Bln = False
  132.                         '下移一个位置
  133.                         Pos = Pos + 1
  134.                     End If
  135.                     ArrJG(i, j) = TempColor
  136.                 Next i
  137.             Next j
  138.             Close #FS
  139.         '处理256色图
  140.         Case 8
  141.             Open FName For Binary Access Read As #FS
  142.             '初始位置
  143.             Pos = DataOffset + 1
  144.             For j = FHeight To 1 Step -1
  145.                 For i = 1 To FWidth
  146.                     '读取一个数据,一个字节表示一个点
  147.                     GetFS Temp, 1, FS, Pos
  148.                     ArrJG(i, j) = ArrColor(Temp(1))
  149.                     '下移一个位置
  150.                     Pos = Pos + 1
  151.                 Next i
  152.             Next j
  153.             Close #FS
  154.         '处理24位
  155.         Case 24
  156.             Open FName For Binary Access Read As #FS
  157.             '初始位置
  158.             Pos = DataOffset + 1
  159.             For j = FHeight To 1 Step -1
  160.                 For i = 1 To FWidth
  161.                     '读取一个数据,三个字节表示一个点
  162.                     GetFS Temp, 3, FS, Pos
  163.                     ArrJG(i, j) = RGB(Temp(3), Temp(2), Temp(1))
  164.                     '下移一个位置,3字节
  165.                     Pos = Pos + 3
  166.                 Next i
  167.             Next j
  168.             Close #FS
  169.     End Select
  170.     '结果输出
  171.     GetBmpPoints = ArrJG
  172. End Function

  173. '数字计算
  174. Function GetNumber(ByVal Temp)
  175.     Dim StrA As String
  176.     Dim StrB As String
  177.     For i = UBound(Temp) To LBound(Temp) Step -1
  178.         StrB = Hex(Temp(i))
  179.         If Len(StrB) = 1 Then StrB = 0 & StrB
  180.         StrA = StrA & StrB
  181.     Next
  182.     GetNumber = WorksheetFunction.Hex2Dec(StrA)
  183. End Function

  184. '读取文件
  185. Sub GetFS(ByRef Temp() As Byte, ByVal Length As Long, ByVal FileNumber As Integer, Optional Pos)
  186.     ReDim Temp(1 To Length)
  187.     If IsMissing(Pos) Then
  188.         Get FileNumber, , Temp
  189.     Else
  190.         Get FileNumber, Pos, Temp
  191.     End If
  192. End Sub



BMP Reader.xlsm.rar
2楼
biaotiger1
阿木就是牛,果然厉害。
3楼
水星钓鱼
这个要逆天啊看来要赶上学长路还很常啊

免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap