您现在的位置是: 软件 > 开发者网络 > 程序方舟 > 开发专栏 > Visual C++开发 > 正文
·速成电脑精英(包分配)白领高薪一族从这里开始



-Java套接字编程(下)
-MediaStudio Pro 6.5教程
-三款卸载软件最新试用
-基于Visual C++的Winsock API研究

Visual C++实现视频图像处理技术
2002-04-06· ·刘 涛··yesky

上一页  1 2  

  视频"画中画"技术

  "画中画"这个概念类似与彩色电视机"画中画",就是在一幅大的图像内显示另外一幅内容不同的小的图像,小图像的尺寸大小一般地说为大图像尺寸的1/4或1/9,显示位置在大图像的右上角。这种技术不仅在电视技术中,在可视电话系统也可以发现这种技术的身影,它们都是依靠硬件来实现的,但是如何在VC开发平台上用编程语言来将该功能添加到自己开发的视频监控软件,为使用者提供更大的信息量呢?也许读者最容易想到的是首先显示大图像,然后再在一个固定位置画第二幅小图像,这种技术技术如果对于静止图像当然没有问题,但是对于视频流,由于每一秒钟需要画25幀,即25幅图像,这样一来计算机需要不停的画不停的擦除,会给用户以闪烁的感觉,如何解决这个问题呢?有的参考书上将大小图像分快显示,这种方法要将待显示的图像数据与显示位置的关系对应起来,容易出错不说,而且麻烦,且速度慢,为此,我对该方法进行了改进,得到了满意的效果。实现的代码如下:

void pictureinpicture( )
{
………………………..
CBitmap bitmap,*oldmap;
pData1=(BYTE*)new char[biWidth*biHeight *3];//biWidth和biHeight为视频采集卡获取//的图像尺寸。
Read(pData1,bih.biWidth*bih.biHeight *3);//该函数从采集卡中获取数据
CClientDC dc(this);
m_pBMI1= new BITMAPINFO;//自定义的BMP文件信息结构,用于后面的图像显示
m_pBMI1->bmiHeader.biBitCount=24;
m_pBMI1->bmiHeader.biClrImportant=0;
m_pBMI1->bmiHeader.biClrUsed=0;
m_pBMI1->bmiHeader.biCompression=0;
m_pBMI1->bmiHeader.biHeight=biHeight;
m_pBMI1->bmiHeader.biPlanes=1;
m_pBMI1->bmiHeader.biSize=40;
m_pBMI1->bmiHeader.biSizeImage=WIDTHBYTES(biWidth*8)*biHeight*3;
m_pBMI1->bmiHeader.biWidth=biWidth;
m_pBMI1->bmiHeader.biXPelsPerMeter=0;
m_pBMI1->bmiHeader.biYPelsPerMeter=0;
////////////////////////////////////////////////////////////////////////
pData2=(BYTE*)new char[biWidth1*biHeight1 *3];//申请存放小图像的缓冲区
Read(pData2,biWidth1*biHeight1 *3);////向该缓冲区读数据
m_pBMI2= new BITMAPINFO;
m_pBMI2->bmiHeader.biBitCount=24;
m_pBMI2->bmiHeader.biClrImportant=0;
m_pBMI2->bmiHeader.biClrUsed=0;
m_pBMI2->bmiHeader.biCompression=0;
m_pBMI2->bmiHeader.biHeight=biHeight1;
m_pBMI2->bmiHeader.biPlanes=1;
m_pBMI2->bmiHeader.biSize=40;
m_pBMI2->bmiHeader.biSizeImage=WIDTHBYTES(biWidth1*8)*biHeight1*3;
m_pBMI2->bmiHeader.biWidth=biWidth1;
m_pBMI2->bmiHeader.biXPelsPerMeter=0;
m_pBMI2->bmiHeader.biYPelsPerMeter=0;
//下面实现画中画的显示

CDC MemDc;
MemDc.CreateCompatibleDC(&dc);
bitmap.CreateCompatibleBitmap(&dc,biWidth,biHeight);
oldmap=MemDc.SelectObject(&bitmap);
::StretchDIBits(MemDc.m_hDC,0,0,biWidth,biHeight,0,0,—biWidth,biHeight,pData1,m_pBMI1,DIB_RGB_COLORS,SRCCOPY);//首先将大图像画在内寸上下文中

::StretchDIBits(MemDc.m_hDC,20,20,biWidth1,biHeight1,_
0,0,biWidth1,biHeight1,pData2,m_pBMI2,DIB_RGB_COLORS,SRCCOPY);//再将小图像画在内寸上下文中

::StretchBlt(dc.m_hDC,0,0,bih.biWidth,bih.biHeight,_
MemDc.m_hDC,0,0,bih.biWidth,bih.biHeight,SRCCOPY);//将结果显示在屏幕上。

MemDc.SelectObject(oldmap);
delete pData1;
delete m_pBMI1;
delete pData2;
delete m_pBMI2;

}

 

上一页  1 2  

【责任编辑:方舟】
【发表评论】【关闭窗口】
■ 相关内容
 Visual C++实现数字图像增强处理
 VC++ SMTP协议电子邮件传送剖析
 VC的另类数据库编程
 理解 Visual C++ Extensions for ADO
 Windows Sockets API实现网络异步通讯
 在VC++下对文件属性的获取与更改
 程序界面多模式显示的实现
 为对话框程序添加工具条和状态栏
 C++之静态联编和动态联编
 Windows 9X硬件中断设备驱动程序的开发
 VC编程中如何操作数据库中的图像字段
 用ATL和MFC来创建ActiveX控件
 ActiveX控件中多控制的设计与实现
 用控件聚合技术为FlexGrid增添PickList功能
 用VC编写具有动态换肤功能的应用程序
 VC实现对不同信号波形相似程度的判别
 多线程安全的变量模板
 利用类的非static成员函数作窗口的处理函数
 利用硬件信息实现共享软件的安全注册
 多线程安全的变量模板
 基于Visual C++ 的自动化客户端的实现
 使用Visual C++开发SOAP客户端应用
 通过COM技术实现Windows外壳编程
 VC编程中如何在界面上实现3D文字
 托管C++程序开发Win表单的文档程序设计(上)
 托管C++程序开发——Win表单的控件使用
 利用Active X控件开发串口通信软件
 用托管C++开发Win表单的一般方法
 Visual C++多媒体及图形、图像处理
 在Visual C++中如何利用UDL文件来建立ADO连接
 在Visual C++中用ADO进行数据库编程
 Visual C++多线程DAO处理
 Visual C++ 系统及硬件编程
 用Visual C++开发数据库应用程序
 Visual C++ 网络与通讯
 Visual C++界面编程
 Visual C++中实现对图像数据的读取显示
 用Visual C++增强Notes打印功能
 用Visual C++操作INI文件
感谢 访问天极网,如果您觉得该文章涉及版权问题,请看这里!