linux应用Xlib来显示内存图像数据到窗口的方式

本文介绍如何利用Xlib在Linux系统中直接显示从相机获取的内存图像数据,包括所需的窗口句柄、Display对象、GC、XImage等关键对象的初始化,并详细阐述了显示时窗口大小调整、部分刷新、缩放处理的实现,以及图像数据转换为显示数据的方法。
摘要由CSDN通过智能技术生成

由于需要动态的将相机取得到图像数据动态的在窗口中显示,开始时试过好几个开源的显示库都没有达到想要到效果,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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值