有效地读取XBMC呈现的屏幕内容的平均颜色

运行XBMC更改电视环境光的颜色时,我想要获得屏幕内容的平均颜色。 XBMC运行在一个带有运行Debian衍生分发的OpenGL ES 2.0硬件(树莓派)的小型HTPC上。 我想我必须从XBMC使用OpenGL绘制的屏幕帧缓冲区读取数据。 (至less,我想,并希望XBMC渲染使用OpenGL的一切。)

是否有可能读取代表整个屏幕输出的OpenGL帧缓冲区? 我需要什么来访问它? 我是否也需要一个自己的渲染上下文来访问屏幕的帧缓冲区? (我没有自己渲染任何东西到屏幕上,我只想 )。

有效地计算平均颜色是下一个任务。 我正在考虑每行/列每8或16像素(足够,我们正在谈论1080p高清电影),然后计算CPU上的平均值。 任何更好的解决scheme的想法是受欢迎的。

Solutions Collecting From Web of "有效地读取XBMC呈现的屏幕内容的平均颜色"

你应该看看这个帖子 ,特别是Boblight 1.3的源代码 。

扩展Boblight似乎是一个可行的选择(如果它不支持你已经需要的!)。

如果没有,看看src/clients/文件夹。 boblight-getpixel.c (用于MS Windows)和boblight-X11.c是“像素采集卡”。 独立的程序可以完全满足您的需求,然后将抓取的颜色传递给boblight服务器。

boblight-X11.c ,有一些使用XShmGetImage或较慢的XGetImage示例,使用X11/extensions/XShm.h读取屏幕的一部分,该代码的一部分:

 [...] 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); } } [...]