我想在运行XBMC改变电视的环境光的颜色时,为了获得屏幕内容的平均颜色。 XBMC是在一个小HTPC用OpenGL ES 2.0硬件(树莓PI)运行运行一个Debian衍生的分布。 我想我有从在其中XBMC抽奖使用OpenGL屏幕帧缓冲器来读取。 (至少,我认为并希望XBMC呈现使用OpenGL的一切。)
是否有可能读取表示整个屏幕输出的OpenGL帧缓冲区? 我该怎么给需要访问它? 难道我还需要一个自己的渲染上下文来访问屏幕的帧缓冲区? (我不呈现由我自己东西在屏幕上,我只想读 )。
有效地计算平均颜色是下一个任务。 我在想读每行/列每8个或16个像素(就足够了,我们正在谈论的1080p高清电影),然后计算CPU的平均水平。 为更好的解决方案的任何想法,欢迎。
你应该看看Boblight的源代码 。
扩展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);
}
}
[...]