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

问题描述 投票:11回答:1

我想在运行XBMC时获得屏幕内容的平均颜色,以更改电视环境光的颜色。 XBMC运行在一个小型HTPC上,OpenGL ES 2.0硬件(Raspberry Pi)运行Debian派生的发行版。我想我必须从XBMC使用OpenGL绘制的屏幕帧缓冲区中读取。 (至少,我认为并希望XBMC使用OpenGL呈现所有内容。)

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

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

linux opengl-es framebuffer screen-capture
1个回答
6
投票

你应该看看the source code of 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);
   }
}

[...]
© www.soinside.com 2019 - 2024. All rights reserved.