vc++图像显示
显示资源中的图片
(1)从资源中装入位图
● 定义位图对象数据成员CBitmap m_Bitmap;
● 调用CBitmap成员函数LoadBitmap(),如m_Bitmap.LoadBitmap(IDB_BITMAP1);
● 传入LoadBitmap的参数是位图在图形编辑器中生成或从位图文件中引入时赋予的识别符。
(2)生成与位图相联系的内存设备情境对象
CDC MemDC;
MemDC.CreateCompatibleDC(NULL);
MemDC.SelectObject(&m_Bitmap);
(3)显示位图
CClientDC ClientDC(this);
BITMAP BM;
m_Bitmap.GetObject(sizeof(BM),&BM);
ClientDC.BitBlt ( X,Y, //目标设备逻辑横、纵坐标
BM.bmWidth, BM.bmHeight, //显示位图的像素宽、高度
&MemDC, //待显示位图数据的设备情境对象
0,0, //源数据中的横、纵坐标
SRCCOPY); //位操作方式
特点:这种方法显示位图速度快,但不是很灵活,而且会使可执行文件增大。
显示磁盘中的图片
步骤:
HBITMAP *hBitmap; //定义位图对象句柄
BITMAP BM;
CDC MemDC;
CClientDC ClientDC(this);
MemDC.CreateCompatibleDC(&ClientDC);
hBitmap=(HBITMAP*):: LoadImage ( AfxGetInstanceHandle(), //取得应用程序句柄
“demo1.bmp”, //位图文件名
IMAGE_BITMAP, //类型为Windows位图
0,0, LR_LOADFROMFILE); //从文件中取位图数据
MemDC.SelectObject(hBitmap);
:: GetObject(hBitmap,sizeof(BM),&BM);
ClientDC.BitBlt(……) //使用格式与方法一同
特点:这种方法显示位图速度较之前一种慢了一点,但其灵活性较大,可以任意变换位图文件,而无需重新编译源程序, 也减小了可执行文件的大小。
程序模板
显示资源中的图片/在设备上下文中绘制图像[1]
法一
void COutputBmpView::OnDraw(CDC* pDC)
{
COutputBmpDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CDC memDC;//定义一个设备上下文
memDC.CreateCompatibleDC(pDC);//获取兼容的设备上下文
CBitmap bmp;
bmp.LoadBitmap(IDB_BKBITMAP);
memDC.SelectObject(&bmp);//选中位图对象
pDC->BitBlt(30,20,180,180,&memDC,1,1,SRCCOPY);//绘制位图
CRect rc(30,20,210,200);
CBrush brush(RGB(0,0,0));
pDC->FrameRect(rc,&brush);//绘制矩形边框
rc.OffsetRect(220,0);//移动区域
BITMAP BitInfo;
bmp.GetBitmap(&BitInfo);
int x = BitInfo.bmWidth;
int y = BitInfo.bmHeight;
pDC->StretchBlt(rc.left,rc.top,rc.Width(),rc.Height(),&memDC,0,0,x,y,SRCCOPY);//绘制位图
pDC->FrameRect(rc,&brush);
brush.DeleteObject();
memDC.DeleteDC();//释放设备上下文
bmp.DeleteObject();//释放文图对象
}
在磁盘中加载图像到窗口中[1]
CLoadBmpView::CLoadBmpView()//构造函数中
{
m_hBmp = LoadImage(NULL,"Demo.bmp",IMAGE_BITMAP,0,0,LR_LOADFROMFILE);//加载位图
}
void CLoadBmpView::OnDraw(CDC* pDC)
{
CLoadBmpDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
CBitmap bmp;
bmp.Attach(m_hBmp);//将位图关联到位图句柄上
CDC memDC;
memDC.CreateCompatibleDC(pDC);//创建兼容的设备上下文
memDC.SelectObject(&bmp);//选中位图对象
BITMAP BitInfo; //定义位图结构
bmp.GetBitmap(&BitInfo); //获取位图信息
int x = BitInfo.bmWidth; //获取位图宽度
int y = BitInfo.bmHeight; //获取位图高度
pDC->BitBlt(0,0,x,y,&memDC,0,0,SRCCOPY);//向窗口中绘制位图
bmp.Detach();//分离位图句柄
memDC.DeleteDC();//释放设备上下文
}
根据位图数据直接绘图[1]
char *m_pBmpData;//①在视图类中定义一个缓冲区
COutputStreamView::COutputStreamView()//②构造函数中读取文件到数据流中
{
CFile file;//定义文件对象
file.Open("bk.bmp",CFile::modeReadWrite);
int len = file.GetLength();
file.Seek(14,CFile::begin); //*过位图文件头
m_pBmpData = new char[len-14];//为缓冲区分配空间
file.Read(m_pBmpData,len-14);//读取文件数据到缓冲区
file.Close();
}
COutputStreamView::~COutputStreamView()//③析构函数中释放缓冲区
{
delete [] m_pBmpData;
}
void COutputStreamView::OutputStream(char *pStream)//④添加的成员函数,用来根据数据流输出图像
{
char *pHeader =pStream ;//定义临时缓冲区
BITMAPINFO BitInfo;
memset(&BitInfo,0,sizeof(BITMAPINFO));//初始化位图信息对象
memcpy(&BitInfo,pHeader,sizeof(BITMAPINFO));//为位图信息对象赋值
int x = BitInfo.bmiHeader.biWidth;
int y = BitInfo.bmiHeader.biHeight;
pHeader+=40;//指向位图数据
StretchDIBits(GetDC()->m_hDC,0,0,x,y,0,0,x,y,pHeader,&BitInfo,DIB_RGB_COLORS,SRCCOPY);
}
void COutputStreamView::OnDraw(CDC* pDC)//⑥绘制图像
{
COutputStreamDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
OutputStream(m_pBmpData);//输出位图
}
显示JPEG图像[1]
①向视图类添加成员变量
IStream *m_pStream; //定义流对象
IPicture *m_pPicture; //定义接口对象
OLE_XSIZE_HIMETRIC m_JPGWidth; //图像宽度
OLE_YSIZE_HIMETRIC m_JPGHeight; //图像高度
HGLOBAL hMem; //堆句柄
CShowJPEGView::CShowJPEGView()//②构造函数:从磁盘中加载IPEG位图到流中
{
CFile file;
file.Open("angell.jpg",CFile::modeReadWrite);
DWORD len = file.GetLength();
hMem = GlobalAlloc(GMEM_MOVEABLE,len);//在堆中分配内存
LPVOID pData = NULL; //定义一个指针对象
pData = GlobalLock(hMem);//锁定内存区域
file.ReadHuge(pData,len);//读取图像数据到堆中
file.Close();//
GlobalUnlock(hMem);//解除对堆得锁定
CreateStreamOnHGlobal(hMem,TRUE,&m_pStream);//在堆中创建流
OleLoadPicture(m_pStream,len,TRUE,IID_IPicture,(LPVOID*)&m_pPicture);//加载图像
m_pPicture->get_Height(&m_JPGHeight);//获取图像高度
m_pPicture->get_Width(&m_JPGWidth);
}
void CShowJPEGView::OnDraw(CDC* pDC)//③绘制JPEG图像
{
CShowJPEGDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
m_pPicture->Render(pDC->m_hDC,0,0,(int)(m_JPGWidth/26.45),(int)(m_JPGHeight/26.45)
,0,m_JPGHeight,m_JPGWidth,-m_JPGHeight,NULL); //绘制JPEG图像
}
vc++图像显示的更多相关文章
- 在VC下显示JPEG、GIF格式图像的一种简便方法
在VC下显示JPEG.GIF格式图像的一种简便方法 一. 引言 JPEG图像压缩标准随然是一种有损图像压缩标准,但由于人眼视觉的不敏感,经压缩后的画质基本没有发生变化,很快便以较高的压缩率得到了广泛 ...
- CImage 往Picture Control贴图 图像显示不正常
在使用CImage 往vc控件 picture Control 上贴图的时候图像显示不太正常如图: 已知原始图片的宽高为640*640 而我上面picture Control 控件宽高小于原始图像 ...
- Windows 常用运行库下载 (DirectX、VC++、.Net Framework等)
经常听到有朋友抱怨他的电脑运行软件或者游戏时提示缺少什么 d3dx9_xx.dll 或 msvcp71.dll.msvcr71.dll又或者是 .Net Framework 初始化之类的错误而无法正常 ...
- VS15 preview 5打开文件夹自动生成slnx.VC.db SQLite库疑惑?求解答
用VS15 preview 5打开文件夹(详情查看博客http://www.cnblogs.com/zsy/p/5962242.html中配置),文件夹下多一个slnx.VC.db文件,如下图: 本文 ...
- VC程序获取管理员权限
一: 编译程序的时候设置一下 在项目属性--连接器--清单文件--UAC执行级别改为requireAdministrator 二: void GainAdminPrivileges(CString s ...
- 目标电脑未安装VC++6.0或者VS,运行APP丢失DLL问题解决办法
一.背景 VS或者VC++6.0编译出来的程序需要在未安装VS/VC++6.0的电脑上跑,很大情况会出现MSVCRXXX.dll 或者其他DLL丢失的情形,本篇就DLL相关问题做个记录. 二.正文 1 ...
- 6 VC维
1 VC维的定义 VC维其实就是第一个break point的之前的样本容量.标准定义是:对一个假设空间,如果存在N个样本能够被假设空间中的h按所有可能的2的N次方种形式分开,则称该假设空间能够把N个 ...
- VC++6.0 Win32 C2065:SM_XVIRTUALSCREEN
百度了了一大堆,都说让重装vc++6.0,然而并没有什么卵用. 解决办法:找到你的vc6.0安装路径下的WINDOWS.H,将0x0400改为0x0500 Window各个版本对应的宏值WINVER:
- 【VC++技术杂谈004】使用微软TTS语音引擎实现文本朗读
本文主要介绍如何使用微软TTS语音引擎实现文本朗读,以及生成wav格式的声音文件. 1.语音引擎及语音库的安装 TTS(Text-To-Speech)是指文本语音的简称,即通过TTS引擎把文本转化为语 ...
随机推荐
- EasyNVR RTSP摄像机转HLS直播服务器中使用Onvif协议控制预置位
EasyNVR支持预置位控制,包括转到指定预置位,设置指定预置位,删除指定预置位 预置位在安防领域有较为普遍的应用,可以进行很多既定位置的跳转,很方便 之前我们说过如何用Onvif协议进行设备的发现, ...
- jQuery 插件开发(1)
JavaScript 是一门混乱的语言,好的特性和坏的特性混杂在一起.而不同浏览器对标准的解析不一致,使得这门语言更加混乱,在这种情况下遵循最佳实践有诸多好处,至少不会掉入坑里.所以就有了<Ja ...
- window窗口的各种宽高
一 常用的宽高属性 在日常开发的时候,我们常常需要用到这几个高度信息.浏览器的视口高度和宽度,浏览器的卷动高度,正文内容的总高度等等信息,我在下图中列出了在工作中最常用的几个宽度和高度信息.并在本篇文 ...
- CodeForces - 540C Ice Cave —— BFS
题目链接:https://vjudge.net/contest/226823#problem/C You play a computer game. Your character stands on ...
- HDU 2157 How many ways??:矩阵快速幂【i到j共经过k个节点的方法数】
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2157 题解: 给你一个有向图,n个节点m条边,问你从i到j共经过k个节点的方法数(不算i点). 题解: ...
- 分享知识-快乐自己:JAVA中的 Iterator 和 Iterable 区别
java.lang.Iterable java.util.Iterator Iterator是迭代器类,而Iterable是接口. 好多类都实现了Iterable接口,这样对象就可以调用itera ...
- 分享知识-快乐自己:搭建第一个 Hibernate (Demo)
使用 Hibernate 完成持久化操作 七大 步骤: 1.读取并解析配置文件及映射文件: Configuration configuration=new Configuration().config ...
- Linux_异常_04_ftp: command not found...
今天在centos上使用ftp命令连接本机的FTP服务器(本机FTP服务使用Vsftpd搭建),出现如下的错误提示:-bash: ftp: command not found 查询相关资料,发现很有可 ...
- php设置编码格式的方法
a. 如果欲使用gb2312编码,那么php要输出头:header(“Content-Type: text/html; charset=gb2312"),静态页面添加<meta htt ...
- [acm]HDOJ 3082 Simplify The Circuit
题目地址: http://acm.hdu.edu.cn/showproblem.php?pid=3082 字符串处理+并联电阻公式 //11481261 2014-08-18 16:52:47 Acc ...