ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 4175|回复: 26

[已解决] 将24位位图文件按像素转存单元格

[复制链接]

TA的精华主题

TA的得分主题

发表于 2021-12-17 08:50 | 显示全部楼层 |阅读模式
本帖最后由 lcluck2002 于 2021-12-17 11:40 编辑

先说明一下,代码是网上“借鉴”来的。附件里的两段代码,其实是一模一样的。
问题:我在XPSP3+office2007下运行正常,可以在工作表里显示出图像来。
但在换了win10(64位)+office2013下,最后一句显示到单元格的这一句,提示下标越界。
烦请坛里老师帮忙看看,此题何解。感谢!
image.png
(已补充上传附件)

位图转存单元格.zip

329.18 KB, 下载次数: 18

TA的精华主题

TA的得分主题

发表于 2021-12-17 09:52 | 显示全部楼层
我想问问你,用的图片像素和当年用的一样吗?
初步估计,没有进行补零就换行了,最后多换了几次行导致aa值多累加了次数。

TA的精华主题

TA的得分主题

发表于 2021-12-17 11:25 | 显示全部楼层
最好有附件测试,你这个代码截图太抠了,获取像素点方法太多了不同方法不同代码,你的获取像素代码都没看到,而且下标越界肯定是变量超出数组界限,调试窗口一看就看出来

TA的精华主题

TA的得分主题

 楼主| 发表于 2021-12-17 11:40 | 显示全部楼层
905738810 发表于 2021-12-17 11:25
最好有附件测试,你这个代码截图太抠了,获取像素点方法太多了不同方法不同代码,你的获取像素代码都没看到 ...

谢谢你的提醒,原来附件没有上传成功,刚已经重新补充上传了。

TA的精华主题

TA的得分主题

发表于 2021-12-17 11:52 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
应该是以下这段,
其中一些参数没太看懂,不知道有没大神讲解一下,谢谢!
4,18,22,53
  1. Sub draw()
  2. Const photo As String = "图片地址"
  3. Dim phby() As Byte
  4. Dim pxc As Long
  5. Dim pxr As Long
  6. Dim cc As Long
  7. Dim cr As Long
  8. Dim i As Long
  9. Dim j As Long
  10. Dim aa As Long
  11. Dim bb As Long

  12. Open photo For Binary As #1
  13. ReDim phby(LOF(1) - 1)
  14. Get #1, , phby
  15. Close #1
  16. For i = 0 To 3
  17. pxc = pxc + phby(i + 18) * 256 ^ i
  18. Next
  19. For i = 0 To 3
  20. pxr = pxr + phby(i + 22) * 256 ^ i
  21. Next
  22. If pxc Mod 4 <> 0 Then
  23. bb = pxc Mod 4
  24. Sheet1.Cells.Clear
  25. For i = pxr To 1 Step -1
  26. cr = cr + 1
  27. cc = 0
  28. For j = 1 To pxc * 3 Step 3
  29. cc = cc + 1
  30. aa = 53 + j + (i - 1) * (pxc * 3 + bb)
  31. Sheet1.Cells(cr, cc).Interior.Color = RGB(phby(aa + 2), phby(aa + 1), phby(aa))
  32. Next
  33. Next
  34. End If
复制代码

TA的精华主题

TA的得分主题

发表于 2021-12-17 15:21 | 显示全部楼层
代码看了,bmp结构不是很懂,如果是研究bmp结构我不懂了,如果只是提取像素点可以用别的方法试试,举一个WIA.ImageFile方法例子
  1. Sub 转坐标()
  2.     Application.ScreenUpdating = False
  3.     Set Thumb = CreateObject("WIA.ImageFile")
  4.     Thumb.LoadFile "C:\2.bmp"
  5.     kuan = Thumb.Width
  6.     For Each k In Thumb.ARGBData
  7.         i = i + 1
  8.         h = Int((i - 1) / kuan) + 1
  9.         w = ((i - 1) Mod kuan) + 1
  10.         bColor& = k And 16777215
  11.         b& = bColor And 255
  12.         g& = (bColor And 65280) / 256
  13.         r& = (bColor And 16711680) / 65536
  14.         Cells(h, w).Interior.Color = RGB(r, g, b)
  15.     Next
  16.     Application.ScreenUpdating = True
  17. End Sub
复制代码



TA的精华主题

TA的得分主题

发表于 2021-12-17 21:25 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
905738810 发表于 2021-12-17 15:21
代码看了,bmp结构不是很懂,如果是研究bmp结构我不懂了,如果只是提取像素点可以用别的方法试试,举一个WI ...

然后我又想问,您代码中的65280,16711680又是代表什么。。。

TA的精华主题

TA的得分主题

发表于 2021-12-17 21:39 来自手机 | 显示全部楼层
morpheus126 发表于 2021-12-17 21:25
然后我又想问,您代码中的65280,16711680又是代表什么。。。

用了二进制的位运算

TA的精华主题

TA的得分主题

发表于 2021-12-17 21:48 | 显示全部楼层
905738810 发表于 2021-12-17 21:39
用了二进制的位运算

我试了下可以用,虽然参数没搞懂
不过还想问问透明色如何识别呢,我读PNG或者ICO读出来是黑底的
感谢感谢

TA的精华主题

TA的得分主题

发表于 2021-12-17 21:48 | 显示全部楼层
  1. Sub 按钮1_Click()
  2. Dim fn, f
  3. Dim arr() As Byte, H, i
  4. Range("a:a").Clear
  5. fn = Application.GetOpenFilename("图像文件,*.bmp", , "请选文件", , MultiSelect:=True)
  6. If Not IsArray(fn) Then Exit Sub
  7. For Each f In fn
  8.     Open f For Binary As #1
  9.     H = LOF(1)
  10.     ReDim arr(1 To H)
  11.     Get #1, , arr
  12.     Close #1
  13.     For i = 1 To 54
  14.         Cells(i, 1) = arr(i)
  15.     Next

  16.     'Open ThisWorkbook.Path & "\1.jpg" For Binary As #1
  17.     'Put #1, , arr
  18.     'Close #1

  19.     For i = 0 To 3
  20.         PixelCol = PixelCol + arr(i + 19) * 256 ^ i
  21.     Next
  22.     For i = 0 To 3
  23.         PixelRow = PixelRow + arr(i + 23) * 256 ^ i
  24.     Next
  25.     '获取图片的像素高和宽。宽度不是4的倍数时需补零
  26.     If PixelCol Mod 4 <> 0 Then Zeroize = PixelCol Mod 4

  27.     Worksheets("sheet1").Activate
  28.     Cells.Clear
  29.     With Worksheets("sheet1")
  30.     For i = PixelRow To 1 Step -1
  31.         CellRow = CellRow + 1
  32.         CellCol = 0
  33.         For j = 1 To PixelCol * 3 Step 3
  34.             CellCol = CellCol + 1
  35.             lngPos = arr(11) + j + (i - 1) * (PixelCol * 3 + Zeroize)
  36.             .Cells(CellRow, CellCol).Interior.Color = RGB(arr(lngPos + 2), arr(lngPos + 1), arr(lngPos))
  37.         Next
  38.     Next
  39.     End With
  40. Next
  41. End Sub
复制代码


您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-18 23:31 , Processed in 0.048696 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表