12

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

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

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

4

1 回答 1

6

你应该看看Boblight 的源代码

扩展 Boblight 似乎是一个可行的替代方案(如果它不支持您已经需要的东西!)。

如果没有,请查看src/clients/文件夹。boblight-getpixel.c(适用于 MS Windows)并且boblight-X11.c是“像素抓取器”;完全满足您的需求的独立程序,然后将抓取的颜色传达给 boblight 服务器。

boblight-X11.c您有使用的示例或使用阅读屏幕部分XShmGetImage较慢的示例时,该代码的一部分会执行以下操作: XGetImageX11/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);
   }
}

[...]
于 2013-01-16T19:05:37.610 回答