Does someone know how to do a getPixel on Win32 using Ruby? (either to
get a pixel’s color value on a window or on the whole screen). thanks.
Jian L. wrote:
Does someone know how to do a getPixel on Win32 using Ruby? (either to
get a pixel’s color value on a window or on the whole screen). thanks.
ah… and also setPixel() too.
I thought it would be something like
user32 ‘GetPixel’, [‘L’, ‘I’, ‘I’ ], ‘L’
as in
require ‘Win32API’
def user32(name, param_types, return_value)
Win32API.new ‘user32’ , name, param_types, return_value
end
set_cursor_pos = user32 ‘SetCursorPos’, [‘L’ , ‘L’ ], ‘I’
mouse_event = user32 ‘mouse_event’, [‘L’ , ‘L’ , ‘L’ , ‘L’ , ‘L’ ], ‘V’
get_pixel = user32 ‘GetPixel’, [‘L’, ‘I’, ‘I’ ], ‘L’
get_pixel.call 0, 0, 0
but there is an error giving out
get_pixel.rb:4:in `initialize’: GetProcAddress: GetPixel or GetPixelA
(RuntimeError)
from get_pixel.rb:4:in `new'
from get_pixel.rb:4:in `user32'
from get_pixel.rb:10
Jian L. wrote:
Jian L. wrote:
Does someone know how to do a getPixel on Win32 using Ruby? (either to
get a pixel’s color value on a window or on the whole screen). thanks.ah… and also setPixel() too.
Do you want to draw onto the screen?
If so, I think you should use a GUI toolkit, create a maximized window,
without a title bar and border, and then draw onto it. For example, in
wxRuby:
require “wx”
class MyApp < Wx::App
include Wx
def on_init
@mainwindow = Frame.new(nil, -1, “”, DEFAULT_POSITION, DEFAULT_SIZE,
MAXIMIZE)
@mainwindow.background_colour = BLACK
Timer.after(3000) do
@mainwindow.paint do |dc|
dc.pen = WHITE_PEN
dc.draw_line(0, 0, 500, 500)
end
end
Timer.after(5000){@mainwindow.close}
@mainwindow.show
end
end
x = MyApp.new
x.main_loop
This creates a maximized, black window and after 3 seconds it draws a
white line from (0|0) to (500|500). After five seconds (from the
beginning) it closes the window.
Tested with ruby 1.9.1p243 (2009-07-16 revision 24175) [i386-mingw32] on
Windows Vista.
Marvin
Marvin Gülker wrote:
Do you want to draw onto the screen?
If so, I think you should use a GUI toolkit, create a maximized window,
without a title bar and border, and then draw onto it.
can wxRuby get a pixel’s color value off from the screen too? (not
window but the screen)
Jian L. wrote:
Marvin Gülker wrote:
Do you want to draw onto the screen?
If so, I think you should use a GUI toolkit, create a maximized window,
without a title bar and border, and then draw onto it.can wxRuby get a pixel’s color value off from the screen too? (not
window but the screen)
If you create the window like I showed, it will fill the entire
screen. There’s nothing else than the window to see (not even the
taskbar!), so it’s equivalent if you get the pixel from your window or
the screen. And so does it work:
require “wx”
class MyApp < Wx::App
include Wx
def on_init
@mainwindow = Frame.new(nil, -1, “”, DEFAULT_POSITION, DEFAULT_SIZE,
MAXIMIZE)
@mainwindow.background_colour = BLACK
Timer.after(3000) do
@mainwindow.paint do |dc|
dc.pen = WHITE_PEN
dc.draw_line(0, 0, 500, 500)
#Get the pixel color at (100|10) which should be black.
col = Colour.new(255, 255, 255) #This means white
dc.get_pixel(100, 10, col)
p col #=> (0, 0, 0) #This means black
end
end
Timer.after(5000){@mainwindow.close}
@mainwindow.show
end
end
x = MyApp.new
x.main_loop
The #get_pixel method seems to be directly imported from C, because it
works like it would require a pointer. However, it works. The method to
set a pixel directly, is #draw_point.
Marvin