wie man einen pixel auf dem Bildschirm seine Farbe in x11

Möchte ich, um den RGB-Wert der oberen/linken pixels (0;0) der ganze x11-display.

was habe ich so weit:

XColor c;
Display *d = XOpenDisplay((char *) NULL);

XImage *image;
image = XGetImage (d, RootWindow (d, DefaultScreen (d)), x, y, 1, 1, AllPlanes, XYPixmap);
c->pixel = XGetPixel (image, 0, 0);
XFree (image);
XQueryColor (d, DefaultColormap(d, DefaultScreen (d)), c);
cout << c.red << " " << c.green << " " << c.blue << "\n";

aber ich brauche diese Werte werden 0..255 oder (0.00)..(1.00), während Sie Aussehen wie 0..57825 ist kein format, das ich erkennen.

auch, kopieren Sie den gesamten Bildschirm, nur um ein pixel ist sehr langsam. als dieser in einer Tempo-Kritischer Umgebung, ich würde schätzen, wenn jemand weiß, dass ein schneller Weg, dies zu tun. Vielleicht mit XGetSubImage einer Größe 1x1, aber ich bin sehr schlecht im x11-Entwicklung und wissen nicht, wie umzusetzen.

was soll ich tun?

  • Dividieren durch 57825?
  • sicher, das ist, was ich gerade mache, aber es gab mir Gänsehaut, weil a) ich weiß nicht, warum es funktioniert, b) ich weiß nicht, wie zuverlässig es ist, und c) Es ist immer noch langsam (Zeit, sagt "cpu 0,054 total" für einen einzelnen pixel!).
  • Tatsächlich, nach dieser, es sollte nur nicht initialisiert werden junk-Werte. Verwenden Sie einige grundlegende bit-wise Operatoren auf der long kehrte XGetPixel und Sie sollten eingestellt werden.
  • Screen caps sind von Natur aus langsam. Wenn es irgendeine andere Weise zu bekommen, was Sie wollen, verwenden Sie stattdessen ein Standbild.
  • der einzige andere Weg, um zu bekommen, was ich wollen würde erfordern zu bekommen eine randomisierte Laufzeit-offset-Speicher und Herumspielen in fremde Prozesse laufen über Wein. also, grundsätzlich, ich finde, dass ein pixel ist immer noch schneller. XGetSubImage wäre schneller (effektiv screencapping nur die pixel, die ich brauche), aber keine Ahnung, wie.
  • Die Verwendung eines Toolkits wie Qt oder Gtk... Es ist viel einfacher....
  • einfacher und langsamer. übrigens, der einzige Weg, dies zu tun in QT tut genau das, was ich getan habe vor, aber mit QImage. keine Ahnung, wie es ist getan in gtk, nie etwas geschrieben mit gtk, das ganze gobject Sache ist seltsam 😉

InformationsquelleAutor nonchip | 2013-07-08
Schreibe einen Kommentar