mef-t
Осваивающий
- Сообщения
- 306
- Репутация
- 30
Добрый день.
Долго и упорно, в силу незнания winAPI, пытался реализовать задачу из заголовка.
Получилось следующее:
Оно работает, но меня не устраивает время работы.
Вероятнее всего написал много лишнего, неправильно, или есть более элегантное решение моей задачи.
В силу того, что планирую сравнивать списки цветов нескольких картинок, хотел бы сделать более быстрый вариант.
Просьба помочь.
Спасибо.
Долго и упорно, в силу незнания winAPI, пытался реализовать задачу из заголовка.
Получилось следующее:
Код:
#include <WinAPIEx.au3>
#include <Array.au3>
#include <Color.au3>
$hWnd = WinGetHandle("[TITLE:Plants vs. Zombies]"); Вписать заголовок окна
Local $hDDC, $hCDC, $hBMP
$iWidth = _WinAPI_GetWindowWidth($hWnd)
$iHeight = _WinAPI_GetWindowHeight($hWnd)
$hDDC = _WinAPI_GetDC($hWnd)
$hCDC = _WinAPI_CreateCompatibleDC($hDDC)
$hBMP = _WinAPI_CreateCompatibleBitmap($hDDC, $iWidth, $iHeight) ; создаем битовый массив
_WinAPI_SelectObject($hCDC, $hBMP)
DllCall("User32.dll", "int", "PrintWindow", "hwnd", $hWnd, "hwnd", $hCDC, "int", 0)
$color = ''
For $Width = 1 To $iWidth
For $Height = 1 To $iHeight
$l = _WinAPI_GetPixel($hCDC, $Width, $Height)
If Not IsDeclared($l & '_') Then
Assign($l & '_', 0, 1)
$color &= $l & '_'
EndIf
Next
Next
_WinAPI_ReleaseDC($hWnd, $hDDC)
_WinAPI_DeleteDC($hCDC)
_WinAPI_DeleteObject($hBMP) ; очищаем битовый массив
Local $aUnique = StringSplit(StringTrimRight($color, 1), "_", 2)
;~ For $i = 0 To Ubound($aUnique)-1
;~ $aUnique[$i]='0x'&Hex(_ColorGetBlue('0x'&$aUnique[$i]),2) & Hex(_ColorGetGreen('0x'&$aUnique[$i]),2) & Hex(_ColorGetRed('0x'&$aUnique[$i]),2)
;~ Next
_ArrayDisplay($aUnique)
Оно работает, но меня не устраивает время работы.
Вероятнее всего написал много лишнего, неправильно, или есть более элегантное решение моей задачи.
В силу того, что планирую сравнивать списки цветов нескольких картинок, хотел бы сделать более быстрый вариант.
Просьба помочь.
Спасибо.