显示资源中的图片

(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++图像显示的更多相关文章

  1. 在VC下显示JPEG、GIF格式图像的一种简便方法

    在VC下显示JPEG.GIF格式图像的一种简便方法 一. 引言  JPEG图像压缩标准随然是一种有损图像压缩标准,但由于人眼视觉的不敏感,经压缩后的画质基本没有发生变化,很快便以较高的压缩率得到了广泛 ...

  2. CImage 往Picture Control贴图 图像显示不正常

    在使用CImage 往vc控件 picture Control 上贴图的时候图像显示不太正常如图: 已知原始图片的宽高为640*640  而我上面picture Control  控件宽高小于原始图像 ...

  3. Windows 常用运行库下载 (DirectX、VC++、.Net Framework等)

    经常听到有朋友抱怨他的电脑运行软件或者游戏时提示缺少什么 d3dx9_xx.dll 或 msvcp71.dll.msvcr71.dll又或者是 .Net Framework 初始化之类的错误而无法正常 ...

  4. VS15 preview 5打开文件夹自动生成slnx.VC.db SQLite库疑惑?求解答

    用VS15 preview 5打开文件夹(详情查看博客http://www.cnblogs.com/zsy/p/5962242.html中配置),文件夹下多一个slnx.VC.db文件,如下图: 本文 ...

  5. VC程序获取管理员权限

    一: 编译程序的时候设置一下 在项目属性--连接器--清单文件--UAC执行级别改为requireAdministrator 二: void GainAdminPrivileges(CString s ...

  6. 目标电脑未安装VC++6.0或者VS,运行APP丢失DLL问题解决办法

    一.背景 VS或者VC++6.0编译出来的程序需要在未安装VS/VC++6.0的电脑上跑,很大情况会出现MSVCRXXX.dll 或者其他DLL丢失的情形,本篇就DLL相关问题做个记录. 二.正文 1 ...

  7. 6 VC维

    1 VC维的定义 VC维其实就是第一个break point的之前的样本容量.标准定义是:对一个假设空间,如果存在N个样本能够被假设空间中的h按所有可能的2的N次方种形式分开,则称该假设空间能够把N个 ...

  8. VC++6.0 Win32 C2065:SM_XVIRTUALSCREEN

    百度了了一大堆,都说让重装vc++6.0,然而并没有什么卵用. 解决办法:找到你的vc6.0安装路径下的WINDOWS.H,将0x0400改为0x0500 Window各个版本对应的宏值WINVER:

  9. 【VC++技术杂谈004】使用微软TTS语音引擎实现文本朗读

    本文主要介绍如何使用微软TTS语音引擎实现文本朗读,以及生成wav格式的声音文件. 1.语音引擎及语音库的安装 TTS(Text-To-Speech)是指文本语音的简称,即通过TTS引擎把文本转化为语 ...

随机推荐

  1. 绿色版Tomcat的配置

    在环境变量中不配置JAVA_HOME或者JRE_HONE的情况下(正确配置java的路径)不影响java的使用 可以正常使用 java -version .... 但是这种情况下 无法在Tomcat的 ...

  2. winform学习

    1:http://www.cnblogs.com/yieryi/category/704334.html 系列文章 2:http://www.easyicon.net/iconsearch/login ...

  3. 九度OJ 1167:数组排序 (排序)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5395 解决:1715 题目描述: 输入一个数组的值,求出各个值从小到大排序后的次序. 输入: 输入有多组数据. 每组输入的第一个数为数组的 ...

  4. Linux内核的编译安装

    前言 Linux内核是Linux操作2347系统的核心,也是整个Linux功能体现的核心,就如同发动机在汽车中的重要性.内核主要功能包括进程管理.内存管理.文件管理.设备管理.网络管理等.Linux内 ...

  5. MySql索引建立规则

    为了使索引的使用效率更高,在创建索引时,必须考虑在哪些字段上创建索引和创建什么类型的索引.本小节将向读者介绍一些索引的设计原则. 1.选择唯一性索引 唯一性索引的值是唯一的,可以更快速的通过该索引来确 ...

  6. Java 内存模型及GC原理

    一个优秀Java程序员,必须了解Java内存模型.GC工作原理,以及如何优化GC的性能.与GC进行有限的交互,有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率,才能 ...

  7. NLP数据集大放送,再也不愁数据了!【上百个哦】

    奉上100多个按字母顺序排列的开源自然语言处理文本数据集列表(原始未结构化的文本数据),快去按图索骥下载数据自己研究吧! 数据集 Apache软件基金会公开邮件档案:截止到2011年7月11日全部公开 ...

  8. Spring Boot 生成接口文档 swagger2

    swagger,中文“拽”的意思.它是一个功能强大的api框架,它的集成非常简单,不仅提供了在线文档的查阅,而且还提供了在线文档的测试. 另外swagger很容易构建restful风格的api,简单优 ...

  9. <再看TCP/IP第一卷>关于链路层的知识细节及相关协议

    在TCP/IP协议族中,链路层的主要有三个目的: (1)为IP模块发送和接受数据报 (2)为ARP模块发送ARP请求和接受ARP应答 (3)为RARP发送RARP请求和接受RARP应答 TCP/IP支 ...

  10. POJ3581 Sequence —— 后缀数组

    题目链接:https://vjudge.net/problem/POJ-3581 Sequence Time Limit: 5000MS   Memory Limit: 65536K Total Su ...