由于需要动态的将相机取得到图像数据动态的在窗口中显示,开始时试过好几个开源的显示库都没有达到想要到效果,SDL是最接近想要的效果的,可是目前到版本对于多窗口的显示支持还不完善,最终决定应用xlib来直接显示,归根结底这些库最终都是应用xlib来显示的。
在linux下 的xlib显示内存图像数据,几个需要的对象是:
unsigned long m_WinID;窗口句柄
Display * m_display;
GC m_gc;
XImage * m_pDSPImage;
pthread_mutex_t m_lock_Screen; //显示对象的互斥
// 绘图控制
int m_nDrawStartX; //起始坐标 x
int m_nDrawStartY; //起始坐标 y
int m_nDrawWidth; //绘图宽度
int m_nDrawHeight; //绘图高度
这些对象需要初始化:
根据传入的图像的宽高和位深来初始化相关对象资源
void DIBCreate(ULONG Width, ULONG Height, ULONG nColor) {
if (0 == m_WinID)
return;
pthread_mutex_lock(&m_lock_Screen);
m_display = XOpenDisplay(NULL);
if (!m_display) { return;
}
unsigned long valuemask = 0;
XGCValues values;
m_gc = XCreateGC(m_display, (Window) m_WinID, valuemask, &values);
if (!m_gc) {
XCloseDisplay(m_display);
m_display = NULL;
return;
}
Visual *visual = DefaultVisual(m_display, DefaultScreen(m_display));
int imagedepth = DefaultDepth(m_display,DefaultScreen(m_display));
//
//创建屏幕大小的XImage的图像缓冲区,主要由于图像再大显示最大也超不出屏幕,提高显示效率
unsigned int display_width, display_height;//屏幕尺寸
display_width = DisplayWidth(m_display, DefaultScreen(m_display));
display_height = DisplayHeight(m_display, DefaultScreen(m_display));
m_pDSPImage = XCreateImage(m_display, visual, imagedepth, ZPixmap, 0, NULL,
d