2012-12-08 4 views
9

Ich möchte die durchschnittliche Farbe des Bildschirminhalts erhalten, wenn XBMC ausgeführt wird, um die Farbe eines TV-Umgebungslichts zu ändern. XBMC läuft auf einem kleinen HTPC mit OpenGL ES 2.0 Hardware (Raspberry Pi), auf dem eine von Debian abgeleitete Distribution läuft. Ich denke, ich muss vom Bild Bildpuffer lesen, in dem XBMC mit OpenGL zeichnet. (Zumindest denke ich und hoffe, dass XBMC alles mit OpenGL rendert.)Effizient lesen Sie die durchschnittliche Farbe des Bildschirminhalts von XBMC

Ist es möglich, den OpenGL-Bildpuffer zu lesen, der die gesamte Bildschirmausgabe darstellt? Was brauche ich, um darauf zugreifen zu können? Brauche ich auch einen eigenen Renderkontext, um auf den Bildspeicher des Bildschirms zuzugreifen? (Ich mache nichts selbst auf den Bildschirm, ich möchte nur lesen).

Effiziente Berechnung der durchschnittlichen Farbe ist die nächste Aufgabe. Ich denke darüber nach, jeden 8. oder 16. Pixel pro Zeile/Spalte zu lesen (es reicht, wir reden über 1080p HD-Filme) und berechnen dann den Durchschnitt auf der CPU. Irgendwelche Ideen für eine bessere Lösung sind willkommen.

+0

Rahmenpuffer, nicht Bildschirmpuffer, da Sie gefragt. Beide sind jedoch richtig. – Linuxios

+0

@Linuxios Danke. Ich dachte darüber nach "Framepuffer" zu sagen, aber der Leser könnte denken, dass ich etwas, das ich vorher gerendert habe, zurücklesen möchte. Was ist hier nicht der Fall. Ich betone nur, dass es der ganze Bildschirm ist. – leemes

+0

Der Bildpuffer enthält genau das, was gerade auf dem Bildschirm ist. Deshalb sage ich das. – Linuxios

Antwort

5

Sie sollten einen Blick auf the source code of Boblight werfen.

Erweitern Boblight scheint wie eine brauchbare Alternative (wenn es nicht das unterstützt, was Sie schon brauchen!).

Wenn nicht, schauen Sie sich src/clients/ Ordner an. boblight-getpixel.c (für MS Windows) und boblight-X11.c sind "Pixelgrabber"; Standalone-Programme, die genau das tun, was Sie brauchen, und dann die gegriffene Farbe an den Boblight-Server übermitteln.

In boblight-X11.c haben Sie Beispiele für die Verwendung XShmGetImage oder langsamer XGetImage Teile des Bildschirms zu lesen X11/extensions/XShm.h mit, ein Teil dieser Code tut:

[...] 

if(!XShmGetImage(dpy, root_win, xim, 0, 0, AllPlanes)) 
{ 
sleep(1); 
pthread_mutex_unlock(&grabmutex); 
return; 
} 

XSync(dpy, True); 

for (x = 0; x < width; x += xadd) 
{ 
    for (y = 0; y < height; y += yadd) 
    { 
     pixel = XGetPixel(xim, x, y); 
     RGB[0] = (pixel >> 16) & 0xff; 
     RGB[1] = (pixel >> 8) & 0xff; 
     RGB[2] = (pixel >> 0) & 0xff; 

     /*add it to the RGB array*/ 
     boblight_add_pixel (&config, RGB, x, y); 
    } 
} 

[...] 
+0

Vielen Dank! Sehr interessant. In der Tat, vielleicht kann ich dieses Programm hauptsächlich unverändert zum Ausmalen verwenden mein Licht! Ich frage mich, ob dieser Ansatz effizient ist, da ich eine Low-End-Hardware (Raspberry Pi) benutze. Ich denke, ich muss das nur versuchen. Nochmals vielen Dank für diesen Zeiger, den ich bei Google nicht finden konnte (Vielleicht war ich zu konzentriert auf OpenGL) – leemes

+0

Obwohl XMBC OpenGL für seine Benutzeroberfläche verwendet, denke ich, dass es viele verschiedene Optionen hinsichtlich der Videoausgabe gibt.Vergessen Sie nicht, die Antwort zu akzeptieren, wenn Sie es für richtig halten;) – istepaniuk

+0

Die Links altern nicht gut . – Albin