我正在将图片导入到Excel中,并尝试计算用户定义图像区域的平均颜色。为此,用户创建一个边界,然后我循环遍历屏幕像素,以查看它们是否落在该边界内 - 如果是,则将该像素的RGB添加到集合中,最后求得平均值。
我大致理解了这一切,但由于某种原因,我的代码获取像素颜色时出现错误。应该是黄色或蓝色像素(或任何其他颜色),但实际上记录为灰色阴影(通常为16777215或13948116,以Windows十进制值表示)。
我猜测PixelColor函数出了问题。该函数旨在获取我提供的XY坐标(如-1107或830)的像素颜色,但实际上可能返回其他像素的颜色。我试图从检测基于鼠标指针位置的像素颜色的代码进行调整,但在尝试将其从鼠标位置获取XY坐标时显然错了。
获取像素颜色并转换为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
这些内容将被输入到循环遍历单元格的代码中,该代码使用诸如-1107或830之类的XY坐标:
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
如果您能提供任何想法,指出我的错误,那就太好了...非常感谢您的帮助!
GetPixel
API可以检索位图对象的像素颜色。我知道它可以使用LoadPicture
加载,然后需要使用CreateCompatibleDC
API创建lDC
...获取PixelColor
后,必须使用DeleteDC
API释放内存。我无法在此处发布所需的API和代码...如果有兴趣,我可以创建一个使用上述描述过程的函数。 - FaneDuru