有三个函数能够完毕这一功能

1.BitBlt   



BitBlt 用于从原设备中复制位图到目标设备

void CMFCApplication1View::OnDraw(CDC* pDC)
{
CMFCApplication1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return; CDC memDC;//定义一个设备上下文
memDC.CreateCompatibleDC(pDC);//创建兼容的设备上下文
CBitmap bmp;//定义位图对象
bmp.LoadBitmap(IDB_BITMAP1);//载入位图
memDC.SelectObject(&bmp);//选中位图对象
pDC->BitBlt(30, 20, 180, 180, &memDC, 1, 1, SRCCOPY);//绘制位图
}

2.StretchBlt   





从源矩形中复制一个位图到目标矩形,必要时按目标设备设置的模式进行图像的拉伸或压缩,假设目标设备是窗体DC,则意味着在窗体绘制位图。

函数从源矩形中复制一个位图到目标矩形,必要时按目标设备设置的模式进行图像的拉伸或压缩。也即是将内存中的位图复制到屏幕上。而且能够依据屏幕绘图区的大小来进行伸缩。适应响应的屏幕(或图像控件)





BOOL StretchBlt( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, DWORD dwRop );

x:逻辑单元x轴左上角坐标; (获取图像控件的DC后,该值一般设为 0 ) 

y:逻辑单元y轴左上角坐标; (获取图像控件的DC后,该值一般设为 0 ) 

nWidth: 设备矩形宽度;(即是图像控件的宽度,通过int rcWidth = rc.right - rc.left;来获得。rc为保存了图像控件矩形区坐标信息)

nHeight:设备矩形高度;  (即是图像控件的高度,通过int rcHeight = rc.bottom - rc.top;来获得)

pSrcDC: 源设备上下文。   (就是我们定义的内存DC,然后取地址)

xSrc :源矩形x轴左上角坐标;   (一般都是整幅图片拷贝,所以该值为 0 )

ySrc: 源矩形y轴左上角坐标;  (一般都是整幅图片拷贝。所以该值为 0 )

Specifies the x-coordinate (in logical units) of the upper-left corner of the source rectangle.

nSrcWidth:源矩形宽度;(假设我们定义了一个结构体BITMAP类型m_bmp保存位图信息,那么能够用m_bmp.bmWidth获取宽度)

nSrcHeight:源矩形高度 ( 假设我们定义了一个结构体BITMAP类型m_bmp保存位图信息。那么能够用m_bmp.bmHeight获取宽度)

dwRop:指定要进行的光栅操作。(这个有非常多选择,我们一般选择SRCCOPY:将源矩形区域直接复制到目标矩形区域。)





StretchBlt与BitBlt不同在于StretchBlt方法可以延伸或收缩位图以适应目标区域的大小

void CMFCApplication1View::OnDraw(CDC* pDC)
{
CMFCApplication1Doc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
if (!pDoc)
return;
CDC memDC;//定义一个设备上下文
memDC.CreateCompatibleDC(pDC);//创建兼容的设备上下文
CBitmap bmp;//定义位图对象
bmp.LoadBitmap(IDB_BITMAP1);//载入位图
memDC.SelectObject(&bmp);//选中位图对象
CRect rc(30, 20, 210, 200);//定义一个区域
CBrush brush(RGB(0, 0, 0));//定义一个黑色的画刷
pDC->FrameRect(rc, &brush);//绘制矩形边框
//仅仅是用来观察两者差别的,绘制一个矩形框
rc.OffsetRect(220, 0);//移动区域
//下边是利用StretchBlt绘制的位图
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();//释放位图对象
}

3.StretchDIBits函数实现

该函数将DIB(设备无关位图)中矩形区域内像素使用的颜色数据复制到指定的目标矩形中。假设目标设备是窗体DC,相同意味着在窗体绘制位图。

StretchDIBits操作的是设备无关位图是内存中的RGB数据,你必须告诉这个函数关于位图的调色板、大小等信息,也就是位图头。

完毕功能:

对话框程序,加入一个button。点击button后显示图片

(1)设置BYTE*m_pBmpData为类的成员变量,我们要把图片的RGB数据装进去。

(2)button的后台代码

void Cbmp_readDlg::OnBnClickedShowbmp()
{
CFile file; //定义一个文件对象
file.Open(CString("C:\\Users\\jian\\Desktop\\z.bmp"), CFile::modeRead);//打开文件
DWORD dwLen = file.GetLength(); //获取文件长度
file.Seek(14, CFile::begin); //略过位图文件头
if (m_pBmpData != NULL)
{
delete[] m_pBmpData;
m_pBmpData = NULL;
}
m_pBmpData = new BYTE[dwLen - 14]; //为缓冲区分配空间
file.Read(m_pBmpData, dwLen - 14); //读取文件数据到缓冲区
file.Close(); //关闭文件
OnPaint();
}

(3)重写OnPaint函数

void Cbmp_readDlg::OnPaint()
{
/*******************分隔线之间的代码自己主动生成的。不用管************************/
if (IsIconic())
{
CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast<WPARAM>(dc.GetSafeHdc()), 0); // 使图标在工作区矩形中居中
int cxIcon = GetSystemMetrics(SM_CXICON);
int cyIcon = GetSystemMetrics(SM_CYICON);
CRect rect;
GetClientRect(&rect);
int x = (rect.Width() - cxIcon + 1) / 2;
int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标
dc.DrawIcon(x, y, m_hIcon);
} /*******************分隔线之间的代码自己主动生成的,不用管。以下是加入的代码************************/
else
{
if (m_pBmpData != NULL)
{
BYTE *pHeader = m_pBmpData; //定义一个暂时缓冲区
BITMAPINFO BitInfo; //定义位图信息对象
memset(&BitInfo, 0, sizeof(BITMAPINFO)); //初始化位图信息对象
memcpy(&BitInfo, pHeader, sizeof(BITMAPINFO)); //为位图信息对象赋值
int nWidth = BitInfo.bmiHeader.biWidth; //获取位图宽度
int nHeight = BitInfo.bmiHeader.biHeight; //获取位图高度
pHeader += 40; //指向位图数据
//输出位图信息,这里完毕显示
StretchDIBits(GetDC()->m_hDC, 10, 40, nWidth, nHeight, 0, 0, nWidth, nHeight,
pHeader, &BitInfo, DIB_RGB_COLORS, SRCCOPY);
}
CDialogEx::OnPaint();
}
}

SetStretchBltMode





当用StretchBlt缩小时,我们常常发现它会失真:其原由于当StrecthBlt() 的DestRect比SrcRECT小時 必須要將一些点去掉。他的预设做法 是將要去掉的点与旁边的点做AND运算,所以导致像素错误,在调用StretchBlt之前使用SetStretchBltMode函数,该函数能够设置指定设备环境中的位图拉伸模式。

int SetStretchBltMode(HDC hdc, int iStretchMode)

iStretchMode一般选用COLORONCOLOR。即直接將不要的点删掉。

BMP文件的读取与显示的更多相关文章

  1. (学习笔记3)BMP位图的读取与显示

    在(学习笔记2)中.我们已经具体说明怎样去创建MFC.在这节中.主要解决BMP位图照片的读取和显示问题. 我们新建一个projectdemo1.创建步骤请看(学习笔记2)中具体说明. 创建成功后,例如 ...

  2. 使用CadLib实现CAD(dxf、dwg格式)文件的读取和显示 【转】

    参考文章:CadLib 3.5 documentationhttps://www.woutware.com/doc/cadlib3.5/Index.aspx 读取:定义DxfModel类型的变量mod ...

  3. java代码-----实现有键盘获得的字符串存储在文件中,并从文件中读取后显示在屏幕上

    总结: 没体会到 package com.a.b; import java.io.*; public class tsetOut { public static void main(String[] ...

  4. python文件_读取

    1.文件的读取和显示 方法1: f=open(r'G:\2.txt') print f.read() f.close() 方法2: try: t=open(r'G:\2.txt') print t.r ...

  5. Matlab 读取文件夹中所有的bmp文件

    将srcimg文件下的bmp文件转为jpg图像,存放在dstimg文件夹下 str = 'srcimg'; dst = 'dstimg'; file=dir([str,'\*.bmp']); :len ...

  6. 《python核心编程》笔记——文件的创建、读取和显示

    创建文件(makeTextFile.py)脚本提醒用户输入一个尚不存在的文件名,然后由用户输入文件每一行,最后将所有文本写入文本文件 #!/usr/bin/env python 'makeTextFi ...

  7. Servlet从本地文件中读取图片,并显示在页面中

    import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpSer ...

  8. 文件_ _android从资源文件中读取文件流并显示的方法

    ======== 1   android从资源文件中读取文件流并显示的方法. 在android中,假如有的文本文件,比如TXT放在raw下,要直接读取出来,放到屏幕中显示,可以这样: private ...

  9. [代码片段]读取BMP文件

    文件名mybmp.c //实现了读取24位BMP文件,还有一些测试信息 //定义mybmp.c里面用到的函数和相关头文件.常量 //参考了网友sailinghz在CSDN论坛的帖子:http://bb ...

随机推荐

  1. dom事件机制系列

    JS事件流机制 一个完整的JS事件流是从window开始,最后回到window的一个过程,事件流被分为三个阶段: (1~5)捕获过程.(5~6)目标过程.(6~10)冒泡过程. 通过addEventL ...

  2. axure笔记--变量值在页面之间的传递

    fx     先给局部变量赋值,再添加到上面,即给全局变量赋值. 实现页面跳转: 1.打开链接,选择要跳转的下个页面---确定 2.打开那个下一个跳转的页面,要得到上个页面的值,需要到页面交互---页 ...

  3. 【HIHOCODER 1067】最近公共祖先·二(LCA)

    描述 上上回说到,小Hi和小Ho用非常拙劣--或者说粗糙的手段山寨出了一个神奇的网站,这个网站可以计算出某两个人的所有共同祖先中辈分最低的一个是谁.远在美国的他们利用了一些奇妙的技术获得了国内许多人的 ...

  4. poj 1502

    MPI Maelstrom Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 12087   Accepted: 7464 De ...

  5. SpringData及SpringData JPA的理解和简单应用

    SpringData是一个用于简化数据库访问,并支持云服务的开源框架.其主要目标是使得 数据库的访问变得方便快捷,并支持map-reduce框架和云计算数据服务.此外,它还支持 基于关系型数据库的数据 ...

  6. luogu3834 【模板】可持久化线段树 1(主席树)

    关于空间,第零棵树是 \(4n\),其后每棵树都要多来 \(\log(n)\) 的空间,所以我是开 \(n(4+\log(n))\) 的空间. 关于借用节点: 图片来自这里 #include < ...

  7. appium+python自动化-adb shell按键操作(input keyevent)

    前言 接着上篇介绍input里面的按键操作keyevent事件,发送手机上常用的一些按键操作 keyevent 1.keyevent事件有一张对应的表,可以直接发送对应的数字,也可以方式字符串,如下两 ...

  8. 大数据学习——sql练习

    1. 现有如下的建表语句和数据: 建表语句 create table student(Sno int,Sname string,Sex string,Sage int,Sdept string)row ...

  9. Cocos2d-JS 实现将TiledMap中的每个 tile 变成物理精灵的方法

     How to generate a physics body from a tiledmap  鄙人在网上找了许久都未找到方法,说句实在话,Cocos2d官方给出的与物理引擎相关的内容真的不是很多, ...

  10. 【转】DCOM远程调用权限设置

    原文:https://blog.csdn.net/ervinsas/article/details/36424127 最近几天被搞得焦头烂额,由于DCOM客户端程序是在32位系统下开发的,调试时DCO ...