有效地读取由XBMC呈现在屏幕内容的平均颜色(Efficiently read the averag

2019-08-03 17:47发布

我想在运行XBMC改变电视的环境光的颜色时,为了获得屏幕内容的平均颜色。 XBMC是在一个小HTPC用OpenGL ES 2.0硬件(树莓PI)运行运行一个Debian衍生的分布。 我想我有从在其中XBMC抽奖使用OpenGL屏幕帧缓冲器来读取。 (至少,我认为并希望XBMC呈现使用OpenGL的一切。)

是否有可能读取表示整个屏幕输出的OpenGL帧缓冲区? 我该怎么给需要访问它? 难道我还需要一个自己的渲染上下文来访问屏幕的帧缓冲区? (我不呈现由我自己东西在屏幕上,我只想 )。

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

Answer 1:

你应该看看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);
   }
}

[...]


文章来源: Efficiently read the average color of the screen content rendered by XBMC