2

我想打开网络摄像头并用 Xlib 显示视频。因此,我打开网络摄像头,获取图像,然后执行以下操作:

for(x = 0; x < webcamX; x++){
    for(y = 0; y < webcamY; y++){
        pixel = GetCameraPixel(x, y);
        XDrawPoint(dpy, pixmap, pixel, x, y);
    }
}
XCopyArea(dpy, pixmal, window, ....);

但是,调用 XDrawPoint 太慢了。我也尝试使用 XImage,但这次 XPutPixel 和 XPutImage 都很慢(使用 Pixmap 比 XImage 快)

我认为问题在于执行 XDrawPoint 640 * 480 次会向 X 服务器发出大量请求。做XPutImage的时候也是一样,发一个640*480的图片很多..不是吗?

所以,忘记网络摄像头,想象一下我想做一个游戏,一个动画,一个视频播放器,或者任何东西,只有 XLib.. 有可能吗?我确定逐像素绘制效率不高,那我该如何做好呢?我在互联网上找到的所有信息都是使用 Pixmap 或 XImage,它比在窗口本身上绘图要好,但还不够。

例如,xscreensavers 全屏显示非常漂亮的动画(我认为他们只使用 Xlib),他们如何使动画流畅?

谢谢。

4

1 回答 1

1

好吧,我想这是我的错。使用 XImage 是最好的方法,它在逐像素绘制时非常快速和流畅,例如网络摄像头示例。但是,我正在使用 XYPixmap 创建 XImage,它太慢了,我改为 ZPixmap,一切都很完美!

所以,我用于网络摄像头的解决方案是:

image = XCreateImage(dpy, DefaultVisual(dpy, DefaultScreen(dpy)), DefaultDepth(dpy, DefaultScreen(dpy)), ZPixmap, 0, imagedata, webcamX, webcamY, 32, 0);
/* ....*/
for(x = 0; x < webcamX; x++){
    for(y = 0; y < webcamY; y++){
        pixel = GetCameraPixel(x, y);
        XPutPixel(image, x, y, pixel);
    }
}
XPutImage(dpy, window, gc, image, 0, 0, 0, 0, webcamX, webcamY);
  • 使用 ZPixmap 格式创建 XImage
  • 在那个 XImage 中绘制(在我的例子中使用 XPutPixel)
  • 将 XImage 复制到窗口(使用 XPutImage)

我认为使用 XYPixmap 太慢了,因为 X 需要进行某种转换,从而使过程非常缓慢

于 2013-04-07T03:12:56.203 回答