Я импортирую изображения в 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
Любые идеи, где я ошибся, были бы замечательными... заранее спасибо за вашу помощь!
GetPixel
API может получить цвет пикселя растрового объекта. Я знаю, что его можно загрузить с помощьюLoadPicture
, а затем ему нуженCreateCompatibleDC
API для созданияlDC
... После полученияPixelColor
память должна быть освобождена с помощьюDeleteDC
API. Я не могу разместить здесь необходимые API и код... Если интересно, я могу создать функцию, используя вышеописанный процесс. - person FaneDuru   schedule 03.05.2020