FreeBasic
Главная
Вход
Регистрация
Среда, 16.10.2024, 07:04Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Найти цвет пикселя
AlecДата: Воскресенье, 28.09.2014, 12:44 | Сообщение # 1
Лейтенант
Группа: Друзья
Сообщений: 73
Репутация: 1
Статус: Offline
Автор dodicat. Пример здесь. Я проверил, работает.
Наводим курсор на нужный пиксель и нажимем ПРОБЕЛ, чтобы вывести результат. Результат выводится в консольное окно после закрытия основного окна, в трех форматах: RGB, HEX  и HTML. Окно, где показан цвет пикселя, должно быть активным.
Исходник:
 
Код
#include "crt.bi"
Type screenpoint
     As Integer x,y
End Type
Extern "windows" Lib "user32"
Declare Function GetDC Alias "GetDC" (Byval As Any Ptr) As Any Ptr
Declare Function PopBeep Alias "MessageBeep" (Byval As Integer) As Integer
End Extern
Extern "windows" Lib "gdi32"
Declare Function _point Alias "GetPixel"(Byval As Any Ptr,Byval As Integer,Byval As Integer) As Uinteger
End Extern
Declare Function _getmouse Alias "GetCursorPos" (Byval As Any Pointer) As Integer
Declare Function NoConsole Alias "FreeConsole" () As Integer
declare function ShowConsole alias "AllocConsole"  as integer
Dim Shared As Integer xres,yres
'=============================
function HTML(v as uinteger) as string
     dim as string hx=hex(v)
     hx=string(6-len(hx),"0")+hx
     swap hx[0],hx[4]
     swap hx[1],hx[5]
return hx
end function
'=======================================
Dim As Any Ptr MyScreen = GetDC(0)
Dim As Uinteger v

Screenres 200,200,32,,&h20 or &h40
Windowtitle "Colour finder"
Screeninfo xres,yres  
width xres\8,yres\16
NoConsole
Dim As Ubyte r,g,b
Color ,RGB (236,233,216)
Dim As screenpoint m
dim as string key,s="  " +chr(10),msg  
dim as integer x,y
Do
     key=inkey
     if key=" "  then  
         popbeep(0)
var bb=string(3-len(str(b)),"0")+str(b),rr=string(3-len(str(r)),"0")+str(r),gg=string(3-len(str(g)),"0")+str(g)
var sp=string(6-len(hex(v))," ")
         s+= "RGB (" & bb &"," & gg &"," & rr &")"+ "   HEX &h"+hex(v)+sp+"   HTML #"+HTML(v) +chr(10)
     end if
     _getmouse @m
     screencontrol 0,x,y
if m.x>x and m.x<x+xres and m.y>y and m.y<y+yres then msg="<space> to save a colour" else msg=""  
     Screenlock
     Cls
     Locate 1,1
     Color 0
     print "X,Y   ";str(m.x);",";str(m.y)
     'print
     Print "Red   ";b
     Print "Green ";g
     Print "Blue  ";r
     print
     locate 10,1
     print "HEX   &h";hex(v)
     draw string(0,180),msg,rgb(0,0,0)
     print "HTML   #";HTML(v)
     Line(100-30,100-30)-(100+30,100+30),Rgb(b,g,r),bf
     Line(100-30,100-30)-(100+30,100+30),Rgb(0,0,0),b
     v=_point(MyScreen,m.x,m.y)
     r= Cptr(Ubyte Ptr,@v)[2] 'Or just use the standard r,g,b extract method
     g= Cptr(Ubyte Ptr,@v)[1] 'but this method is a tad faster
     b= Cptr(Ubyte Ptr,@v)[0]
     Screenunlock
     Sleep 1,1
Loop Until key=Chr(255,107) or key=chr(27)
  if s<>"  " +chr(10) then
screen 0
showconsole
puts(s)
sleep
end if


WorldSim3D - 3D движок для FreeBasic, для PC. Мощная 3D графика и простота программирования. Ознакомиться.
 
haavДата: Воскресенье, 28.09.2014, 18:24 | Сообщение # 2
Генералиссимус
Группа: Администраторы
Сообщений: 1366
Репутация: 49
Статус: Offline
Неплохой пример, хотя конечно не очень продумано сохранение и получение пикселя. Было бы гораздо удобнее получать значения из основного окна, путем копирования в буфер обмена.

Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
AlecДата: Воскресенье, 28.09.2014, 19:28 | Сообщение # 3
Лейтенант
Группа: Друзья
Сообщений: 73
Репутация: 1
Статус: Offline
Ну да, можно немного переделать его пример, чтобы копировать в буфер обмена.

WorldSim3D - 3D движок для FreeBasic, для PC. Мощная 3D графика и простота программирования. Ознакомиться.
 
  • Страница 1 из 1
  • 1
Поиск: