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