ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 图片转换成字符图

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-10-17 16:14 | 显示全部楼层
zopey 发表于 2018-10-17 16:03
取消选择图片路径的 弹出窗口(可能有的电脑不支持), 直接赋值为 f,

f = ThisWorkbook.Path & "\20 ...

丢失库,MMCC那个,不能运行,不要库不行吗?

TA的精华主题

TA的得分主题

发表于 2018-10-17 16:27 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
dongdonggege 发表于 2018-10-17 16:14
丢失库,MMCC那个,不能运行,不要库不行吗?

我不知道 你遇到什么错误,控件 就一个按钮,用来点击 执行宏代码的。
代码在7楼 你复制过去执行。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-10-17 16:37 | 显示全部楼层
zopey 发表于 2018-10-17 16:27
我不知道 你遇到什么错误,控件 就一个按钮,用来点击 执行宏代码的。
代码在7楼 你复制过去执行。

7楼的代码执行到22行提示溢出

TA的精华主题

TA的得分主题

发表于 2018-10-17 16:43 | 显示全部楼层
dongdonggege 发表于 2018-10-17 16:37
7楼的代码执行到22行提示溢出

不是任意图片都能 直接识别的。请选择标准的24位bmp图片 ,附件中 "2016.bmp"  。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-10-17 16:50 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zopey 发表于 2018-10-17 16:43
不是任意图片都能 直接识别的。请选择标准的24位bmp图片 ,附件中 "2016.bmp"  。

那这有局限性

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-10-17 19:44 | 显示全部楼层
zopey 发表于 2018-10-17 13:50
bits(0, ix, iy)  的内容应该是 数字,而 mid取的字符,类型不符。
我怕麻烦, 能不用api 函数 实现转换   ...

字符型怎么赋值给数值型,是str()还是CStr()

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-10-19 09:19 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
zopey 发表于 2018-10-17 16:43
不是任意图片都能 直接识别的。请选择标准的24位bmp图片 ,附件中 "2016.bmp"  。

大师,你好,现在我进行了一些调整,代码如下:
  1. Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
  2. Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
  3. Private Declare Function CreateCompatibleDC Lib "gdi32" (ByVal hdc As Long) As Long
  4. Private Declare Function DeleteDC Lib "gdi32" (ByVal hdc As Long) As Long
  5. Private Declare Function CreateCompatibleBitmap Lib "gdi32" (ByVal hdc As Long, ByVal nWidth As Long, ByVal nHeight As Long) As Long
  6. Private Declare Function OleCreatePictureIndirect Lib "olepro32.dll" (PicDesc As PicBmp, RefIID As GUID, ByVal fPictureOwnsHandle As Long, IPic As IPicture) As Long
  7. Private Declare Function GetDIBits Lib "gdi32" (ByVal aHDC As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BitMapInfo, ByVal wUsage As Long) As Long
  8. Private Declare Function SetDIBits Lib "gdi32" (ByVal hdc As Long, ByVal hBitmap As Long, ByVal nStartScan As Long, ByVal nNumScans As Long, lpBits As Any, lpBI As BitMapInfo, ByVal wUsage As Long) As Long
  9. Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
  10. Private Declare Function CreateEllipticRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
  11. Private Declare Function CreateRectRgn Lib "gdi32" (ByVal X1 As Long, ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
  12. Private Declare Function CreatePatternBrush Lib "gdi32" (ByVal hBitmap As Long) As Long
  13. Private Declare Function FillRgn Lib "gdi32" (ByVal hdc As Long, ByVal hRgn As Long, ByVal hBrush As Long) As Long
  14. Private Declare Function DeleteObject Lib "gdi32" (ByVal hObject As Long) As Long

  15. Private Const DIB_RGB_COLORS = 0 '  color table in RGBs

  16. Private Type BitMapInfoHeader
  17.     biSize As Long
  18.     biWidth As Long
  19.     biHeight As Long
  20.     biPlanes As Integer
  21.     biBitCount As Integer
  22.     biCompression As Long
  23.     biSizeImage As Long
  24.     biXPelsPerMeter As Long
  25.     biYPelsPerMeter As Long
  26.     biClrUsed As Long
  27.     biClrImportant As Long
  28. End Type

  29. Private Type RGBQuad
  30.     rgbBlue As Byte
  31.     rgbGreen As Byte
  32.     rgbRed As Byte
  33.     ''rgbReserved As Byte
  34. End Type

  35. Private Type BitMapInfo
  36.     bmiHeader As BitMapInfoHeader
  37.     bmiColors As RGBQuad
  38. End Type

  39. Private Type GUID
  40.     Data1   As Long
  41.     Data2   As Integer
  42.     Data3   As Integer
  43.     Data4(7)   As Byte
  44. End Type

  45. Private Type PicBmp
  46.     Size   As Long
  47.     Type   As Long
  48.     hBmp   As Long
  49.     hPal   As Long
  50.     Reserved   As Long
  51. End Type

  52. Private Const HIMETRIC_PER_PIXEL = 96 / 2540
  53. Private Const vbPicTypeBitmap = 1

  54. Private Enum EnumPicMode
  55.     BlackWhite = 0
  56.     GrayScale = 1
  57.     浮雕 = 2
  58.     负片 = 3
  59.     油画 = 4
  60.     木刻 = 5
  61. End Enum

  62. Private Sub CommandButton1_Click() '灰度
  63.     hwnd& = FindWindow(vbNullString, "UserForm1")
  64.     hdc = GetDC(hwnd)
  65.     Rgn1 = CreateRectRgn(0, 0, 400, 400)
  66.     Brush1 = CreatePatternBrush(Convert(LoadPicture("d:\psu1.jpg"), GrayScale))
  67.     FillRgn hdc, Rgn1, Brush1
  68.     DeleteObject Brush1
  69. End Sub

  70. Private Function Convert(PicSrc As StdPicture, ToMode As EnumPicMode, Optional bytThreshold As Byte = 128) As StdPicture
  71.     Dim ix As Integer
  72.     Dim iy As Integer
  73.     Dim iWidth As Integer '以像素为单位的图形宽度
  74.     Dim iHeight As Integer '以像素为单位的图形高度
  75.     Dim bytTarget As Byte
  76.     Dim hdc As Long, hDCmem As Long
  77.     Dim hBmp As Long, hBmpPrev As Long
  78.    
  79.     Dim bits() As Byte '三维数组,用于获取原彩色图像中各像素的RGB数值以及存放转化后的灰度值
  80.    
  81.     Dim bitsBW() '三维数组,用于存放转化为黑白图后各像素的值
  82.    
  83.     '获取图形的宽度和高度
  84.     iWidth = PicSrc.Width * HIMETRIC_PER_PIXEL
  85.     iHeight = PicSrc.Height * HIMETRIC_PER_PIXEL
  86.    
  87.     '创建并初始化一个bitMapInfo自定义类型
  88.     Dim bi24BitInfo As BitMapInfo
  89.     With bi24BitInfo.bmiHeader
  90.         .biBitCount = 32
  91.         .biCompression = 0&
  92.         .biPlanes = 1
  93.         .biSize = Len(bi24BitInfo.bmiHeader)
  94.         .biWidth = iWidth
  95.         .biHeight = iHeight
  96.     End With
  97.     '重新定义数组大小
  98.     ReDim bits(0 To 3, 0 To iWidth - 1, 0 To iHeight - 1) As Byte
  99.     ReDim bitsBW(0 To 3, 0 To iWidth - 1, 0 To iHeight - 1)
  100.     hdc = GetDC(0)
  101.     hDCmem = CreateCompatibleDC(hdc)
  102.     '使用GetDIBits方法一次性获取picture1中各点的rgb值,比point方法或getPixel函数逐像素获取像素rgb要快出一个数量级
  103.     lrtn = GetDIBits(hDCmem, PicSrc.Handle, 0&, iHeight, bits(0, 0, 0), bi24BitInfo, DIB_RGB_COLORS)
  104.     '数组的三个维度分别代表像素的RGB分量、以图形左下角为原点的X和Y坐标。
  105.     '具体说来,这时bits(0,2,3)代表从图形左下角数起横向第2个纵向第3个像素的Blue值,而bits(1,2,3)和bits(2,2,3)分别的Green值和Red值.
  106.    
  107.     Select Case ToMode
  108.     Case GrayScale '***********RGB转为灰度******
  109.         ascii_char = "$@B%8&WM#*oahkbdpqwmZO0QLCJUYXzcvunxrjft/\|()1{}[]?-_+~<>i!lI;:,\^`'. "
  110.         pLength = Len(ascii_char)
  111.         unit = (256# + 1) / pLength
  112.         For ix = 0 To iWidth - 1
  113.             For iy = 0 To iHeight - 1
  114.                 'Debug.Print bits(0, ix, iy), bits(1, ix, iy), bits(2, ix, iy)
  115.                 bytTarget = bits(0, ix, iy) * 0.11 + bits(1, ix, iy) * 0.59 + bits(2, ix, iy) * 0.3 '这是传统的根据三原色亮度加权得到灰阶的算法
  116.                 ascii_char = Int(bytTarget / unit)
  117.                 bitsBW(0, ix, iy) = Mid(ascii_char, Int(bytTarget / unit) + 1, 1)
  118.                 bitsBW(1, ix, iy) = Mid(ascii_char, Int(bytTarget / unit) + 1, 1)
  119.                 bitsBW(2, ix, iy) = bytTarget
  120.             Next
  121.         Next
  122.    
  123.     End Select
  124.    
  125.     '************下面是从DIBits转为stdPicture的代码***************
  126.     hBmp = CreateCompatibleBitmap(hdc, iWidth, iHeight) '创建一个与屏幕兼容的位图,得到它的句柄
  127.     SetDIBits hDCmem, hBmp, 0, iHeight, bitsBW(0, 0, 0), bi24BitInfo, DIB_RGB_COLORS '将DIBits信息放入hBmp中
  128.     DeleteDC hDCmem
  129.     ReleaseDC 0, hdc
  130.    
  131.     '从hBmp得到stdPicture的标准方法
  132.     Dim r     As Long
  133.     Dim pic     As PicBmp
  134.     Dim IPic     As StdPicture
  135.     Dim IID_IDispatch     As GUID
  136.     '填充IDispatch界面,clsID为{00020400-0000-0000-C000-000000000046}
  137.     With IID_IDispatch
  138.         .Data1 = &H20400
  139.         .Data4(0) = &HC0
  140.         .Data4(7) = &H46
  141.     End With
  142.     '填充Pic结构
  143.     With pic
  144.         .Size = Len(pic) 'pic结构的大小
  145.         .Type = vbPicTypeBitmap '图形类型, Bitmap
  146.         .hBmp = hBmp '位图句柄
  147.         .hPal = 0 '因为是24位色,所以不需要设定Pallete
  148.     End With
  149.     '建立Picture对象
  150.     r = OleCreatePictureIndirect(pic, IID_IDispatch, 1, IPic)
  151.     '返回Picture对象
  152.     Set Convert = IPic
  153. End Function
复制代码

图像有起色,得到图像如图,还是有问题,都是竖的线,好像是1237-129行的mid的数值有问题,请帮我改改看。
图像.jpg

TA的精华主题

TA的得分主题

发表于 2018-10-19 09:54 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
dongdonggege 发表于 2018-10-19 09:19
大师,你好,现在我进行了一些调整,代码如下:

图像有起色,得到图像如图,还是有问题,都是竖的线, ...

VBA代码 来处理图片 老毛子费劲了!!!

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-10-19 10:11 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
duquancai 发表于 2018-10-19 09:54
VBA代码 来处理图片 老毛子费劲了!!!

大师,那这个在窗体怎么做?

TA的精华主题

TA的得分主题

发表于 2018-10-19 10:27 来自手机 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
dongdonggege 发表于 2018-10-19 10:11
大师,那这个在窗体怎么做?


VBA代码做窗体啊?更麻烦!等后面的大神吧!
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-18 22:23 , Processed in 0.040753 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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