How to do a getPixel on Win32 using Ruby?

J

Jian Lin

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.
 
J

Jian Lin

Jian said:
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.
 
J

Jian Lin

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
 
M

Marvin Gülker

Jian said:
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
 
J

Jian Lin

Marvin said:
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)
 
M

Marvin Gülker

Jian said:
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
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,744
Messages
2,569,484
Members
44,903
Latest member
orderPeak8CBDGummies

Latest Threads

Top