在VBA中逐像素扫描图像

2024-01-03

这里有一个近乎精确的问题读取图像的像素颜色 https://stackoverflow.com/questions/16528319/read-pixel-colors-of-an-image

实际上,Op 提出的问题与我所问的问题相同。但接受一个几乎就在那里但不完全是的答案。下面的代码(取自该线程)完成了我需要的一切,除了逐个像素位。如果您单击图像,它将为您提供单击站点的颜色。因为我想扫描整个图片,所以我只想进行 X Y 扫描并放入连续的 X 和 Y,而不是 GetCursorPos 调用返回的 X 和 Y。但是如何获取左侧位置和宽度(例如)以像素为单位来开始扫描?我会在 for next 循环中放入什么来处理每个像素?

所以为了澄清我的问题。 如何更改下面的代码以扫描图像的每个像素而不仅仅是单击的光标位置。谢谢

#If VBA7 Then
    Private Declare PtrSafe Function GetPixel Lib "gdi32" (ByVal hdc As LongPtr, ByVal x As Long, ByVal y As Long) As Long
    Private Declare PtrSafe Function GetCursorPos Lib "user32" (ByRef lpPoint As POINT) As LongPtr
    Private Declare PtrSafe Function GetWindowDC Lib "user32" (ByVal hwnd As LongPtr) As LongPtr
#Else
    Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal x As Long,     ByVal y As Long) As Long
    Private Declare Function GetCursorPos Lib "user32" (ByRef lpPoint As POINT) As Long
    Private Declare Function GetWindowDC Lib "user32" (ByVal hwnd As Long) As Long
#End If
Private Type POINT
    x As Long
    y As Long
End Type

Sub Picture1_Click()
    Dim pLocation As POINT
    Dim lColour As Long

    Dim lDC As Variant
    lDC = GetWindowDC(0)
    Call GetCursorPos(pLocation)
    lColour = GetPixel(lDC, pLocation.x, pLocation.y)
    Range("a1").Interior.Color = lColour
End Sub

Option Explicit

Private Declare Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Declare Function ReleaseDC Lib "user32" (ByVal hwnd As Long, ByVal hdc As Long) As Long
Private Declare Function GetDeviceCaps Lib "gdi32" (ByVal hdc As Long, ByVal nIndex As Long) As Long
Private Declare Function GetCurrentThreadId Lib "kernel32" () As Long
Private Declare Function GetPixel Lib "gdi32" (ByVal hdc As Long, ByVal X As Long, ByVal Y As Long) As Long


Private Type RECT
  Left As Long
  Top  As Long
  Right As Long
  Bottom As Long
End Type

Private Type POINTAPI
    X As Long
    Y As Long
End Type
Dim IDC As Long

Private Function ScreenDPI(bVert As Boolean) As Long
  '*** Get screen DPI ***
  Static lDPI&(1), lDC&
  If lDPI(0) = 0 Then
    lDC = GetDC(0)
    lDPI(0) = GetDeviceCaps(lDC, 88&)    'horz
    lDPI(1) = GetDeviceCaps(lDC, 90&)    'vert
    lDC = ReleaseDC(0, lDC)
  End If
  ScreenDPI = lDPI(Abs(bVert))
End Function

Private Function PTtoPX(Points As Single, bVert As Boolean) As Long
'*** Swap Points to pixels ****
  PTtoPX = Points * ScreenDPI(bVert) / 72
End Function
Sub GetImageRect(ByRef RC As RECT)
Dim RNG As Range
Set RNG = Sheet1.Range("A1")

'**** using the spread sheet cell A1 as a reference ***
'** find the details of th eimage and convert to pixels ***
  Dim wnd As Window
  Set wnd = RNG.Parent.Parent.Windows(1)
  With Sheet1.Image1
    RC.Left = PTtoPX(.Left * wnd.Zoom / 100, 0) + wnd.PointsToScreenPixelsX(0)
    RC.Top = PTtoPX(.Top * wnd.Zoom / 100, 1) + wnd.PointsToScreenPixelsY(0)
    RC.Right = PTtoPX(.Width * wnd.Zoom / 100, 0) + RC.Left
    RC.Bottom = PTtoPX(.Height * wnd.Zoom / 100, 1) + RC.Top
  End With
End Sub

Sub XYScanOfImage()
'*** put an active X image on sheet1 call it image1 and run this routine **
'** to get the colour information for each pixel *****
Dim RC As RECT
Dim ScanX As Single
Dim ScanY As Single
Dim ImX As Single
Dim ImY As Single
Dim PixCol As Single

Call GetImageRect(RC)
ImX = RC.Left
ImY = RC.Top

IDC = GetDC(0)
'*** scan image left to right top to bottom ****
For ScanX = RC.Left To RC.Right
  For ScanY = RC.Top To RC.Bottom
    PixCol = GetPixel(IDC, ScanX, ScanY)
    '**** PUT CODE IN HERE TO PROCESS THE PIXEL COLOUR ****
  Next
Next
IDC = ReleaseDC(0, IDC)
End Sub
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在VBA中逐像素扫描图像 的相关文章

  • 从 SinkWriter 或 ICodecAPI 或 IMFTransform 获取编码器名称

    我使用 SinkWriter 来使用媒体基础对视频进行编码 初始化 SinkWriter 后 我想获取它使用的底层编码器 并打印出它的名称 这样我就可以看到它使用的编码器 就我而言 编码器很可能是H 264 视频编码器 http msdn
  • 随着数据的增加自动填充公式并动态排序[重复]

    这个问题在这里已经有答案了 我想对工作表中的数据进行排序 该工作表每天都会在第二个工作表中获取新行 问题是 如果我使用 SMALL 函数并自动填充单元格直到最后一行 A102482 或类似的内容 我的文件会变得非常巨大且滞后 gt 20mb
  • 了解 GetDiBits。 C++

    MSDN 说位图用于GetDiBits在调用此函数之前不应将其选入 DC 但根据我的经验 与BitBlt 我知道除非选择了位图 否则我无法绘制位图 如何GetDiBits规避这个 我可以只使用未选择的 新创建的位图作为该函数的参数吗 Get
  • 如果单元格包含 1 个或多个关键字,则更改不同单元格的值

    我有一个列 其中包含一些字符串描述 例如 Bob davids mowing the lawn tipping cows 此外 我将在不同的工作表或列上列出关键字列表 例如工作关键字列表1 davids work 播放关键字列表 mowin
  • 了解 VerQueryValue

    在 MSDN 上 我注意到 VerQueryValue 函数的以下内容 lplp缓冲区 输出 低电压空洞当此方法返回时 包含指向 pBlock 指向的缓冲区中所请求版本信息的指针的地址 当关联的 pBlock 内存被释放时 lplpBuff
  • 根据不同的列数据范围隐藏行

    我对使用 VBA 相当陌生 我正在尝试创建一个代码 该代码将查看具有不同数据范围的两个不同列 并隐藏最后一个数据点之外的行 引用两列 目前我有这个 Private Sub Worksheet PivotTableUpdate ByVal T
  • 在 Excel 中的文件夹内的所有文件上添加一列

    我在一个文件夹内有 250 个不同的 excel 文件 具有相同的布局 其中包含列A to F 我需要在列上添加新列G 传统的方法是打开每个文件并在以下位置添加新列G 有没有使用 Excel 宏或任何其他工具的简单过程来完成此任务 这个链接
  • 从嵌入的谷歌地图中提取标记坐标

    对此还很陌生 所以请耐心等待 我需要从嵌入的谷歌地图中提取标记坐标 示例链接是http www picknpay co za store search http www picknpay co za store search我想提取搜索时地
  • CURL 相当于使用 VBA 的 POST JSON 数据

    我知道这与之前提出的一些问题类似 但有些东西仍然对我不起作用 如何执行以下命令 curl X POST data statements json H Content Type application json user username p
  • 检测笔记本电脑盖子的关闭和打开

    是否可以检测笔记本电脑的盖子何时打开或关闭 从我读到的内容来看 这是不可能的 但 SO 之前已经帮助我完成了不可能的任务 我发现唯一可能朝着正确方向的事情是关于报告电源按钮所需的 IOCTL 的 MSDN 博客文章 https learn
  • 避免 UAC 但使用 Windows 服务启动提升的进程

    我有一个非交互式服务作为 Windows 计算机上的特权系统用户运行 我需要它来启动给定的可执行文件作为提升的进程 我已设法使用 WTSGetActiveConsoleSessionId 以 SYSTEM 身份启动一个子进程 找到一个系统进
  • 使用 VBA 在 Access 表中记录计数

    我正在尝试获取表的记录数 如果计数大于 17 则创建一个新表 Dim rst As DAO Recordset strSQL Select from SKUS Set rst db OpenRecordset strSQL If rst R
  • 关闭工作簿时删除范围,xls vba

    我想要范围 Range A2 G z 关闭工作簿时删除 有人可以帮我处理代码吗 谢谢 凯 这就是我尝试过的 Option Explicit Sub Makro1 insert clipboard Workbooks Pfl SchutzSt
  • 计算 Windows 10 上第 3 方窗口的标题栏按钮的总宽度

    我最初的方法是使用GetSystemMetrics with SystemMetric SM CXSIZE以及一些基于可用按钮的简单数学计算 乘以 3 或乘以 1 通过WindowStyle DllImport user32 dll pri
  • Excel VBA 用户窗体 - 当发生变化时执行 Sub

    我有一个包含很多文本框的用户表单 当这些文本框的值发生变化时 我需要通过调用子例程 AutoCalc 根据文本框值重新计算最终结果值 我有大约 25 个框 我不想向每个调用上述子例程的文本框单独添加 Change 事件 当某些值发生变化时调
  • VBA全局类变量

    我的障碍是试图让多个子程序识别类变量 当我尝试全局声明它们时 出现编译错误 无效的外部过程 然后 当我运行公共函数或子函数来声明变量时 它们在其他子函数中保持未定义状态 我希望多个子程序能够识别变量 因为它们的值应该通过用户窗体进行更改 然
  • 打开 Excel 工作簿时自动运行 VBA 代码

    我有 VBA 代码 我想在打开 Excel 工作簿时运行 我尝试在代码应该运行的工作表中创建一个公共过程 Public Sub Workbook Open Some code here End Sub 工作簿打开时它不会运行 它应该在其中一
  • 当存储在集合中时,如何更改类属性的值

    我想将一个类存储在集合中 并且能够更改该类的属性 而不必删除集合项并再次将其添加回来 我的研究表明 如果不进行删除 替换操作 则无法更改项目本身 但是项目的属性又如何呢 下面的代码展示了如何执行此操作 当您运行宏时 调试窗口将显示存储对象的
  • 如何VBA等待Windows保存对话框和发送密钥

    我正在创建一个宏文件 用于下载并保存从 SAP 旧版本 7 20 中提取的数据 当出现保存对话框时 未检测到 Windows 对话框 因为我的客户端 SAP 版本是旧版本 7 20 现在我对此的解决方案是发送密钥 但问题是某些数据包含大量数
  • 正在使用的 VBA 监视文件

    我正在寻找一些东西 Win API 调用或其他 来在文件可供编辑 即不再使用 时通知我 我应该设置一个计时器来按一定时间间隔检查文件还是有一个好方法对文件设置监视 FileSystemWatcher 没有帮助 Win32 FindFirst

随机推荐

  • Team Build 2012 是否与 Team Foundation Server 2010 兼容?

    连接是一种什么体验团队建设 http en wikipedia org wiki Team Foundation Server Team Build2012年至团队基础服务器 http en wikipedia org wiki Team
  • 如何计算根据条件选择的一组行中的元素数量?

    我有一个大DataFrame有许多重复值 唯一值存储在List1 我想做以下事情 选择包含列表中存在的每个值的几行 迭代选定的行并计算非 NaN 元素的数量 如果计数值大于或等于2 则将其存储到新列表中 中的每个组件List1应添加到eq
  • 当read.table中5行之后出现不同数量的列时,fill=TRUE会失败吗? [复制]

    这个问题在这里已经有答案了 假设我们有一个文件名test txt其中包含未知数量的列 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4
  • 如何从 React Redux 中的子组件进行分派?

    我的服务器有这样的代码
  • Android 多实例

    我在android中的通知中遇到问题 每当我单击通知时 我都必须再次调用相同的活动 但据我认为新的活动被调用 但前一个活动也在后端运行 因为我的代码一次又一次地运行 因为有多个实例 请帮助我如何在每次单击通知时解决或关闭多个实例 code
  • 当文档窗口在 Visual Studio 中获得焦点时发生的事件

    我在 Visual Studio 中有一个可扩展性项目 我需要使用当我在 Visual Studio 编辑器中从一个窗口更改为另一个窗口时触发的事件 我的问题是 我创建了一个显示一些图表的工具窗口 该图表依赖于一个可编辑文件 当我保存可编辑
  • Nestjs同时设置http和https服务器

    我正在尝试设置 http 和 https 服务器 咨询了官方文件 https docs nestjs com faq multiple servers nest i System Information OS Version Windows
  • 可从同一类的另一个实例访问私有字段[重复]

    这个问题在这里已经有答案了 我没有得到以下信息 我一直认为我只能从声明该字段的类访问私有字段 但是在这种情况下我可以访问它 class Session List
  • 子类化用户控制的 GridView

    我正在尝试对位于 UserControl 中的 GridView 进行子类化 因此 我希望能够在单独的页面中处理事件 基本上我的代码如下 我的带有 GridView 的 UserControl div div
  • 二分查找,从 java 到 Actionscript

    我正在尝试将以下 java 二进制搜索例程转换为 as3 我假设 compareTo 是内置的java方法 而 gt gt gt 是一种按位运算 任何熟悉 ActionScript 3 和 Java 的人都可以帮忙解决这个问题吗 packa
  • Excel 单元格值被 OLEDB 提供程序截断

    我正在使用 OleDbConnection 类从 Excel 2000 2003 工作簿检索数据 string connectionString Provider Microsoft Jet OLEDB 4 0 Data Source fi
  • 为什么垂直滚动条会自动移动?

    例如 我不明白为什么当单击 Line 9 时垂直滚动条会自动移动到最顶部位置 进一步单击不会移动滚动条 谁能解释为什么以及如何解决这个问题 我使用 Firefox 3 6 3 HTML div div
  • Fortran 中对多个矩阵进行加权和求和的最有效方法

    我正在尝试用 Fortran 编写一个函数 将多个具有不同权重的矩阵相乘 然后将它们加在一起形成一个矩阵 我已经确定这个过程是我的程序的瓶颈 这个权重将被many程序单次运行的时间 具有不同的权重 现在我正试图通过从 Matlab 切换到
  • 找不到项目文件

    我有一个现有的 TFS 项目 其结构与此类似 我在框架目录中创建了一个包含 2 个项目的解决方案 然后 我将 Cerberus 和 Cerberus Mvc 作为现有项目添加到 OnFaitQuoi 解决方案中 请注意 之前已签入 cerb
  • SSH.NET 从 ShellStream 检索输出

    我是 SSH NET 的新手 我正在我目前正在进行的一个项目中使用它 我必须使用 SSH NET 运行 sudo 命令 这就是我使用 ShellStream 运行该命令并为 sudo 命令提供身份验证的原因 现在我尝试运行 sudo 命令
  • 链接到完整的 div - html 和 css

    一些文字 sliderPart width 25 height 100 sliderPart a display block position relative text decoration none height 100 font 1
  • 如何将 BIT2 类型链接到变量?

    In most input cardsBeckhoff 有两个变量 Limit 1 and limit 2 他们有个BIT2datatype 大小为0 2字节 即有两位 如下图所示Limit 1 Bit0 Value smaller equ
  • 如何使用 python 在 Tensorboard 上显示模型的权重和偏差

    我创建了以下模型进行训练 并希望在 Tensorboard 上将其可视化 Basic Cell LSTM tensorflow index in epoch 0 perm array np arange x train shape 0 np
  • 正则表达式在页面上查找两个单词

    我试图找到包含单词 text1 和 text2 的所有页面 我的正则表达式 text1 n text2 it doesn t work 如果您的 IDE 支持s 单线 标志 所以 字符可以匹配换行符 您可以使用以下方式搜索您的项目 text
  • 在VBA中逐像素扫描图像

    这里有一个近乎精确的问题读取图像的像素颜色 https stackoverflow com questions 16528319 read pixel colors of an image 实际上 Op 提出的问题与我所问的问题相同 但接受