Я импортирую изображения в Excel и пытаюсь рассчитать средний цвет для определенной пользователем области изображения. Чтобы сделать это, пользователь создает границу, а затем пропускает пиксели экрана oop, чтобы увидеть, попадают ли они в эту границу или нет - если они это делают, то 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
Любые идеи, где я ошибся, были бы великолепны ... заранее спасибо за вашу помощь!