Color of a screen pixel: Difference between revisions

From Rosetta Code
Content added Content deleted
m (→‎{{header|C}}: spaces instead of tabs)
m (capitalization)
Line 1: Line 1:
{{task|GUI}}[[Category:Testing]]Get color information from an arbitrary pixel on the screen, such as the current location of the mouse cursor. The mouse cursor may or may not have to be active in a gui created by your program.
{{task|GUI}}[[Category:Testing]]Get color information from an arbitrary pixel on the screen, such as the current location of the mouse cursor. The mouse cursor may or may not have to be active in a GUI created by your program.


{{omit from|MUMPS}}
{{omit from|MUMPS}}

Revision as of 06:28, 2 July 2010

Task
Color of a screen pixel
You are encouraged to solve this task according to the task description, using any language you may know.

Get color information from an arbitrary pixel on the screen, such as the current location of the mouse cursor. The mouse cursor may or may not have to be active in a GUI created by your program.

AutoHotkey

<lang AutoHotkey>MouseGetPos, MouseX, MouseY PixelGetColor, color, %MouseX%, %MouseY%</lang>

BASIC

Works with: QuickBasic version 4.5

In a graphics mode (for instance, SCREEN 13 or SCREEN 12) <lang qbasic>color = point(x, y)</lang>

C

Works with: Windows

<lang c>COLORREF getColorAtCursor(void) {

   POINT p;
   COLORREF color;
   HDC hDC;
   BOOL b;
   // Get the device context for the screen
   hDC = GetDC(NULL);
   if (hDC == NULL)
       return CLR_INVALID;
   // Get the current cursor position
   b = GetCursorPos(&p);
   if (!b)
       return CLR_INVALID;
   // Retrieve the color at that position
   color = GetPixel(hDC, p.x, p.y);
   // Release the device context again
   ReleaseDC(GetDesktopWindow(), hDC);
   return color;

}</lang>

C#

<lang csharp>using System; using System.Drawing; using System.Windows.Forms;

Bitmap img = new Bitmap(1, 1); Graphics g = Graphics.FromImage(img); g.CopyFromScreen(new Point(x, y), new Point(0, 0), new Size(1, 1));

Color color = img.GetPixel(x, y);</lang>

Clojure

<lang lisp>(defn get-color-at [x y]

 (.getPixelColor (java.awt.Robot.) x y))</lang>

F#

The C# example copies the entire screen into our private bitmap but that's unnecessary. All we need is the single pixel. Also, it doesn't appear that the bitmap and graphics object are being disposed of there. Other than that, this is essentially identical to that solution. <lang fsharp>open System.Drawing open System.Windows.Forms

let GetPixel x y =

   use img = new Bitmap(1,1)
   use g = Graphics.FromImage(img)
   g.CopyFromScreen(new Point(x,y), new Point(0,0), new Size(1,1))
   let clr = img.GetPixel(0,0)
   (clr.R, clr.G, clr.B)

let GetPixelAtMouse () =

   let pt = Cursor.Position
   GetPixel pt.X pt.Y 

</lang>

Java

<lang java>public static Color getColorAt(int x, int y){

  return new Robot().getPixelColor(x, y);

}</lang>

PureBasic

Return the color used at the x,y position in the current output. If the current output has an alpha channel then the result will be a 32bit RGBA value, otherwise it will be a 24bit RGB value. The color can be split in their RGB and alpha values by using the Red(), Green(), Blue() and Alpha() functions.

<lang PureBasic>Color = Point(x, y)</lang>

To get the colour of a pixel on the screen when it is not managed by PureBasic (ie. from other programs' windows), it is necessary to use Windows API. This works only under Windows. <lang PureBasic> hDC = GetDC_(0) Color = GetPixel_(hDC, x, y) ReleaseDC_(0, hDC)</lang>

Python

Library: PyWin32

<lang python>def get_pixel_colour(i_x, i_y): import win32gui i_desktop_window_id = win32gui.GetDesktopWindow() i_desktop_window_dc = win32gui.GetWindowDC(i_desktop_window_id) long_colour = win32gui.GetPixel(i_desktop_window_dc, i_x, i_y) i_colour = int(long_colour) return (i_colour & 0xff), ((i_colour >> 8) & 0xff), ((i_colour >> 16) & 0xff)

print get_pixel_colour(0, 0)</lang>

Library: PIL
Works with: Windows

only

<lang python>def get_pixel_colour(i_x, i_y): import PIL.ImageGrab return PIL.ImageGrab.grab().load()[i_x, i_y]

print get_pixel_colour(0, 0)</lang>

Library: PIL
Library: python-xlib

<lang python>def get_pixel_colour(i_x, i_y): import PIL.Image # python-imaging import PIL.ImageStat # python-imaging import Xlib.display # python-xlib o_x_root = Xlib.display.Display().screen().root o_x_image = o_x_root.get_image(i_x, i_y, 1, 1, Xlib.X.ZPixmap, 0xffffffff) o_pil_image_rgb = PIL.Image.fromstring("RGB", (1, 1), o_x_image.data, "raw", "BGRX") lf_colour = PIL.ImageStat.Stat(o_pil_image_rgb).mean return tuple(map(int, lf_colour))

print get_pixel_colour(0, 0)</lang>

Library: PyGTK

<lang python>def get_pixel_colour(i_x, i_y): import gtk # python-gtk2 o_gdk_pixbuf = gtk.gdk.Pixbuf(gtk.gdk.COLORSPACE_RGB, False, 8, 1, 1) o_gdk_pixbuf.get_from_drawable(gtk.gdk.get_default_root_window(), gtk.gdk.colormap_get_system(), i_x, i_y, 0, 0, 1, 1) return tuple(o_gdk_pixbuf.get_pixels_array().tolist()[0][0])

print get_pixel_colour(0, 0)</lang>

Library: PyQt

<lang python>def get_pixel_colour(i_x, i_y): import PyQt4.QtGui # python-qt4 app = PyQt4.QtGui.QApplication([]) long_qdesktop_id = PyQt4.QtGui.QApplication.desktop().winId() long_colour = PyQt4.QtGui.QPixmap.grabWindow(long_qdesktop_id).toImage().pixel(i_x, i_y) i_colour = int(long_colour) return ((i_colour >> 16) & 0xff), ((i_colour >> 8) & 0xff), (i_colour & 0xff)

print get_pixel_colour(0, 0)</lang>

Tcl

Library: Tk

Works only on X11 or OSX with Xquartz. <lang tcl>package require Tcl 8.5 package require Tk

  1. Farm out grabbing the screen to an external program.
  2. If it was just for a Tk window, we'd use the tkimg library instead

proc grabScreen {image} {

   set pipe [open {|xwd -root -silent | convert xwd:- ppm:-} rb]
   $image put [read $pipe]
   close $pipe

}

  1. Get the RGB data for a particular pixel (global coords)

proc getPixelAtPoint {x y} {

   set buffer [image create photo]
   grabScreen $buffer
   set data [$image get $x $y]
   image delete $buffer
   return $data

}

  1. Demo...

puts [format "pixel at mouse: (%d,%d,%d)" \

   {*}[getPixelAtPoint {*}[winfo pointerxy .]]]</lang>

TI-89 BASIC

Only the graph screen can be read.

<lang ti89b>pxlTest(y, x) © returns boolean</lang>