Предполагаю, что нужно сделать скриншот в память, а от туда уже цвет брать по координатам, правда самой реализации вообще не представляю.
Как узнать цвет пикселя на экране используя PureBasic?
Сообщений 1 страница 7 из 7
Поделиться204.06.2013 20:39:26
Программа CatchColor. http://purebasic.info/OpenSource/index.php
Поделиться301.07.2013 01:25:53
Спасибо, выдернул из CatchColor
Мне вот нужно получить цвет пикселей из такого вот квадратика
*DC=GetDC_(GetCapture_()) For x=1 To 100 For y=1 To 100 color=GetPixel_(*DC, x, y) Next y Next x
Простите, а побыстрей как-нибудь можно? 4 минуты очень долго.
На AutoIt есть библиотека она тоже самое делает за 0.3 секунды, но как ее прикрутить к PureBasic я не понял, тут нужны специалисты в обоих языках.
Поделиться401.07.2013 03:41:03
Надо не в цикле обращаться к каждому пискелю экрана и брать его цвет, а делать скриншот нужной области экрана и уже в памяти работать с ним, т.е. проходить его попиксельно.
Поделиться501.07.2013 06:40:43
Надо не в цикле обращаться к каждому пискелю экрана и брать его цвет, а делать скриншот нужной области экрана и уже в памяти работать с ним, т.е. проходить его попиксельно.
Спасибо, Добрый человек, ты наверное заметил, что я прямо с этого и начал свое первое сообщение в этой теме. Принцип, как ты понял, я понимаю, а с реализацией хотелось, чтобы мне помогли.
Поделиться601.07.2013 13:18:53
На AutoIt есть библиотека она тоже самое делает за 0.3 секунды
Медленно.
PureBasic тратит на это (снятие скрина с экрана и попиксельный разбор) меньше миллисекунды (меньше тысячной доли секунды).
DisableDebugger
Procedure MakeDesktopScreenshot(ImageNr,x,y,Width,Height)
Protected hImage, hDC, hWnd, DeskDC
hImage = CreateImage(ImageNr,Width,Height)
If hImage
hDC = StartDrawing(ImageOutput(ImageNr))
If hDC
hWnd=GetDesktopWindow_()
DeskDC = GetDC_(hWnd)
BitBlt_(hDC,0,0,Width,Height,DeskDC,x,y,#SRCCOPY)
StopDrawing()
ReleaseDC_(hWnd,DeskDC)
Else
FreeImage(ImageNr)
hImage = 0
EndIf
EndIf
ProcedureReturn hImage
EndProcedure
t = ElapsedMilliseconds()
; Сделали скрин части экрана
If MakeDesktopScreenshot(0,20,50,100,100)
If StartDrawing(ImageOutput(0))
For x=0 To 99
For y=0 To 99
color=Point(x, y)
Next y
Next x
StopDrawing()
EndIf
EndIf
r = ElapsedMilliseconds()-t
MessageRequester("", "Выполнено за "+StrF(r/1000, 3)+" секунды")Поделиться705.10.2013 13:39:01
как получить цвет формы, гаджета и т.д.? Вот находил один код но он крыво работает, если даже работает.
Define FolderIcon
Define Draw
Procedure GetWindowBkColor(hWnd)
A$=Space(40)
GetObject_(GetClassLong_(hWnd,#GCL_HBRBACKGROUND),40,@A$)
ProcedureReturn PeekL(@A$+4)
EndProcedure
ExtractIconEx_("shell32.dll",130,0,@FolderIcon, 1)
CreateImage(1,32,32)
Draw = StartDrawing(ImageOutput(1))
Box(0,0,32,32,0)
DrawIcon_(Draw,0,0,FolderIcon)
StopDrawing()
If OpenWindow(0,0,0,500,250,"Window",#PB_Window_SystemMenu|#PB_Window_ScreenCentered)
SetWindowColor(0,$353535)
ImageGadget(1,10,10,0,0,ImageID(1),0)
Debug Hex(GetWindowBkColor(WindowID(0)))
Repeat : Until WaitWindowEvent() = #PB_Event_CloseWindow
EndIfОтредактировано mestnyi (05.10.2013 13:39:17)
Похожие темы
| Работа с изображениями | Вопросы по PureBasic | 13.04.2016 |