【发布时间】:2020-05-04 16:09:55
【问题描述】:
我正在将图像导入 Excel,并尝试计算用户定义的图像区域的平均颜色。为此,用户创建一个边界,然后我循环遍历屏幕像素以查看它们是否落在此边界内 - 如果是,则将该像素的 RGB 添加到集合中,然后在最后取平均值。
我已经大致完成了这一切,但由于某种原因,我的代码导致像素颜色检测错误。应该是黄色或蓝色像素(或任何其他颜色)的内容被记录为灰色阴影(通常为 16777215 或 13948116,在 Windows 十进制值中)。
我认为我的 PixelColor 函数有问题,该函数旨在获取我输入它的 XY 坐标的像素颜色(值,例如 -1107 或 830),但必须返回其他一些像素的颜色。我试图从根据鼠标光标所在像素检测颜色的代码中对此进行调整,但显然在尝试为其提供 XY 坐标而不是从光标位置获取时出现了问题。
获取像素颜色并转换为RGB的代码如下:
Private Declare PtrSafe Function GetPixel Lib "gdi32" (ByVal hdc As Long, 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
Private Declare PtrSafe Function GetDC Lib "user32" (ByVal hwnd As Long) As Long
Private Type POINT
X As Long
Y As Long
End Type
Private Function PixelColor(ByVal X As Long, ByVal Y As Long) As Long
Dim lDC As Variant
lDC = GetWindowDC(0)
PixelColor = GetPixel(lDC, X, Y)
End Function
这些输入到循环通过单元格的代码中,该代码使用 XY 坐标,例如 -1107 或 830:
Sub AverageColour()
'loop through pixels
For i = MinX To MaxX
For j = MinY To MaxY
'check if pixel falls within user-defined polygon
If udfPointInPolygon(i, j, Range("B2:C21")) = True Then
PointColor = PixelColor(i, j)
collR.Add CStr(m_RGB_Red(PointColor))
collG.Add CStr(m_RGB_Green(PointColor))
collB.Add CStr(m_RGB_Blue(PointColor))
End If
Next j
Next i
'calculate collection averages
totalR = 0
totalG = 0
totalB = 0
For k = 1 To collR.Count
totalR = totalR + collR(k)
Next k
For k = 1 To collG.Count
totalG = totalG + collG(k)
Next k
For k = 1 To collB.Count
totalB = totalB + collB(k)
Next k
averageR = totalR / collR.Count
averageG = totalG / collG.Count
averageB = totalB / collB.Count
End Sub
任何我出错的想法都会很棒...在此先感谢您的帮助!
【问题讨论】:
-
你尝试获取屏幕上的像素颜色吗?
-
我不确定你所说的@FaneDuru 是什么意思。使用 XY 坐标 -1105、815 运行此代码会输出颜色 16777215(灰色)。我实际上是从吸管工具中得到这些坐标的,它与颜色(黄色)一起输出坐标。
-
我的意思是
GetPixelAPI 可以检索位图对象的像素颜色。我知道它可以使用LoadPicture加载,然后它需要CreateCompatibleDCAPI 来创建lDC... 在获得PixelColor之后,必须使用DeleteDCAPI 释放内存。我不能在这里发布必要的 API 和代码...如果有兴趣,我可以使用上述过程创建一个函数。 -
如果可以,那就太好了!