比bitblt和stretchblt效率更高的函数

BMP位图锉刀安排及光滑的缩放
—- 以公共方式显示BMP位图,大内存,攻击:严厉批评或猛烈攻击慢,典型的人或事物,极要紧的图像失真,在低色数字DE中显示高色数字时图像失真很大。。本文运用电视的重大聚会来显示BMP位图。,是你这么说的嘛!错误可以淘汰。。
—- 一、BMP锉刀安排
—- 1. BMP锉刀分解
—- BMP锉刀出生于锉刀头、位图书信头、变色书信和图形唱片的四元组比率。
—- 2. BMP锉刀头
—- BMP锉刀头唱片安排容纳BMP锉刀的典型、公司或企业锉刀一定尺寸的和位图地方的书信。
—- 其安排构成释义列举如下
typedef struct tagBITMAPFILEHEADER
{
WORDbfType; // 位图锉刀的典型,得是BM
DWORD bfSize; // 位图锉刀的一定尺寸的,以音节为单位
WORDbfReserved1; // 位图锉刀保存字,得是0
WORDbfReserved2; // 位图锉刀保存字,得是0
DWORD bfOffBits; // 位图唱片的获得学位地方,对立位图
// 锉刀头的偏移表现,以音节为单位
} BITMAPFILEHEADER;
—- 3. 位图书信头
—-
BMP位图头书信用于阐明位图和O的一定尺寸的。
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; // 此安排中运用的音节数
LONGbiWidth; // 位图的宽度,以像素为单位
LONGbiHeight; // 位图的绝顶,以像素为单位
WORD biPlanes; // 目的装备的职别,得是1
WORD biBitCount// 每个像素所需的位数,它得是1(双色)。,
// 4(16色),8种(256种色)或24种(真变色)说得中肯一种
DWORD biCompression; // 位图紧缩典型,得是 0(未紧缩),
// 1(BiO-Re8紧缩型)或2(BiO-Re4紧缩型)
DWORD biSizeImage; // 位图的一定尺寸的,以音节为单位
LONGbiXPelsPerMeter; // 位图程度分辨系数,每米像素数
LONGbiYPelsPerMeter; // 位图铅直分辨系数,每米像素数
DWORD biClrUsed;// 位图实践运用的色表说得中肯色数
DWORD biClrImportant;// 位图显示迅速移动中要紧色的总计
} BITMAPINFOHEADER;
—- 4. 色表
—- 色表用于阐明位图说得中肯色。,它有分别的表项,每个表项是第一RGBQuad典型的安排,构成释义色。RGBQUAD安排的构成释义列举如下
typedef struct tagRGBQUAD {
BYTErgbBlue;// 蓝色发光度(地域为0~255)
BYTErgbGreen; // 绿色发光度(地域为0~255)
BYTErgbRed; // 白色发光度(地域为0~255)
BYTErgbReserved;// 保存,得是0
} RGBQUAD;
色表说得中肯RGBQUAD安排唱片的接近由BiBiTCO决定
当biBitCount=1,4,8时,有2个,16,256表记入项主词
当biBitCount=24时,无色表项。
位图书信前进和色表以表格位图书信,BITMAPFIONE安排构成释义列举如下
typedef struct tagBITMAPINFO {
BITMAPINFOHEADER bmiHeader; // 位图书信头
RGBQUAD bmiColors[1]; // 色表
} BITMAPINFO;
—- 5. 位图唱片
—- 位图唱片记载位图的每个像素值,记载次是在扫描行内是从左到右,扫描线经过的线是从和弦基音到顶部。。位图的像素值说得中肯音节数
当biBitCount=1时,8像素占1音节
当biBitCount=4时,2像素占1音节
当biBitCount=8时,1像素占1音节
当biBitCount=24时,1像素占3音节
Windows指定的扫描行所受雇的音节数得是
乘数为4(即长),充填缺乏0,
一种扫描线受雇音节数的计算方式
DataSizePerLine= (biWidth* biBitCount+31)/8; 
// 扫描线受雇的音节数
DataSizePerLine= DataSizePerLine/4*4; // 音节数得是4的乘法器。
位图唱片的一定尺寸的(不成紧缩)
DataSize= DataSizePerLine* biHeight;
—- 二、BMP位图行显示方式
—- 1. 适用仓库空间仓库位图锉刀
—- GlobalAlloc(GHND,锉刀大小)
—- 2. 位图锉刀被读取到所适用的仓库空间中。
—- LoadFileToMemory( mpBitsSrc,mFileName);
—- 3. 运用位图在喜欢做OnPaint的重大聚会中安排显示
—- 用CreateDIBitmap安排显示位图,用CreateCompatibleDC安排协调的DC,
—- 用SelectBitmap选择显示位图。
—- 4. 用新葡京娱乐场或StretchBlt等重大聚会显示位图
—- 5. 用DeleTeObjt截安排的位图
—- 是你这么说的嘛!方式的错误是 1)显示攻击:严厉批评或猛烈攻击慢 2) 大内存受雇 3) 当显示缩减时,位图图像失真。,(可以经过使成为一部分字形光滑的软件来处置) 4) 在低色位数的装备上(如256显示文字)显示高色位数的图形(如真变色)图形极要紧的图像失真。
—- 三、位图缩放显示
—- 用Doudib电视的效能显示位图,内存受雇少,攻击:严厉批评或猛烈攻击快,它还可以缩减图形(轻轻摇晃)。。变弱是一种图形算法,它可以用于在倒退较次的色的装备上显示变色图像。。BMP位图显示方式列举如下
—- 1. 翻开电视的效能,它通常定位球在安排重大聚会中。
—- 2. 适用仓库空间仓库位图锉刀
—- GlobalAlloc(GHND,锉刀大小)
—- 3. 位图锉刀被读取到所适用的仓库空间中。
—- LoadFileToMemory( mpBitsSrc,mFileName);
—- 4. 在OnPaint中运用拉夫养殖及另外效能,DrawDibDraw()显示位图
—- 5. 逼近电视的效能,它普通放在析构重大聚会中。
—- 是你这么说的嘛!方式的优点是 1)显示攻击:严厉批评或猛烈攻击快 2) 内存受雇少 3) 急速移动显示说得中肯小图像失真,4) 在低色数字装备上显示具有高色数字的小图形。 5) 连续的处置位图唱片,可以从事简略动画片。
—- 四、CVIEBIMAP类程序点
—- 1. 在CVIEBIMAP类中添加电视的效能和另外身体部位
HDRAWDIB m_hDrawDib; // 电视的重大聚会
HANDLEmhBitsSrc; // 位图锉刀句柄(内存)
LPSTR mpBitsSrc; // 位图锉刀地址(内存)
BITMAPINFOHEADER *mpBitmapInfo; // 位图书信头
—- 2. 在CVIEBIMAP类安排重大聚会中添加翻开的电视的重大聚会
—- m_hDrawDib= DrawDibOpen();
—- 3. 在CVIEBIMAP类析构重大聚会中添加逼近电视的效能
if( m_hDrawDib != 空)
{
DrawDibClose( m_hDrawDib);
m_hDrawDib = NULL;
}
—- 4. 在CViewBimap类图形显示重大聚会OnPaint中添加GraphicDraw()
voidCViewBitmap::OnPaint()
{
CPaintDC 恒流(这么地) // device context for painting
GraphicDraw( );
}
voidCViewBitmap::GraphicDraw( void )
{
CClientDC 恒流(这么地) // device context for painting
BITMAPFILEHEADER *pBitmapFileHeader;
ULONG bfoffBits= 0;
CPoint Wid;
// 图形锉刀名无效 (=0 BMP)
if( mBitmapFileType < ID_BITMAP_BMP ) return;
// 图形锉刀名无效 (=0 BMP)
// 预备显示真变色位图
pBitmapFileHeader= (BITMAPFILEHEADER *) mpBitsSrc;
bfoffBits= pBitmapFileHeader->bfOffBits;
// 用普通重大聚会显示位图
if( m_hDrawDib == NULL || mDispMethod == 0)
{
HBITMAP hBitmap=::CreateDIBitmap(,
mpBitmapInfo, CBM_INIT, mpBitsSrc+bfoffBits,
(LPBITMAPINFO) mpBitmapInfo,DIB_RGB_COLORS); 
// 设置位图
HDC hMemDC=::CreateCompatibleDC();// 设置内存
HBITMAP hBitmapOld= SelectBitmap(hMemDC, hBitmap); // 选择不赞成
// 身体部位克利特岛 MDSPR用于管理的图形显示区域的一定尺寸的。
// 身体部位CPoint MPOS用于管理的图形DI的获得学位地方被归入同一类别。
if( mPos.x > (mpBitmapInfo- >biWidth – () ))
mPos.x= mpBitmapInfo->biWidth – () ;
if( mPos.y > (mpBitmapInfo- >biHeight- ()))
mPos.y= mpBitmapInfo- >biHeight- ();
if( mPos.x < 0 ) mPos.x= 0;
if( mPos.y < 0 ) mPos.y= 0;
if( mFullViewTog == 0)
{
// 显示真变色位图
::新葡京娱乐场(,0,0, (), (),
hMemDC,mPos.x,mPos.y, SRCCOPY);
} else {
::StretchBlt(,0,0, (), (),
hMemDC,0,0, mpBitmapInfo- >biWidth, mpBitmapInfo-
>biHeight, SRCCOPY);
}
// 完毕显示真变色位图
::DeleteObject(SelectObject(hMemDC,hBitmapOld)); 
// 删 除 位 图
} else {
// 运用电视的效能显示位图
if( mPos.x > (mpBitmapInfo- >biWidth – () ))
mPos.x= mpBitmapInfo- >biWidth – () ;
if( mPos.y > (mpBitmapInfo- >biHeight- ()))
mPos.y= mpBitmapInfo- >biHeight- ();
if( mPos.x < 0 ) mPos.x= 0;
if( mPos.y < 0 ) mPos.y= 0;
// 显示真变色位图
DrawDibRealize( m_hDrawDib, (), 真的)
if( mFullViewTog == 0)
{
Wid.x= ();
Wid.y= ();
// 1:1 显示时, 不克不及大于图的一定尺寸的
if( Wid.x > mpBitmapInfo- >biWidth )
Wid.x = mpBitmapInfo- >biWidth;
if( Wid.y > mpBitmapInfo- >biHeight)
Wid.y = mpBitmapInfo- >biHeight;
DrawDibDraw( m_hDrawDib, ()
, 0, 0, Wid.x, Wid.y,
mpBitmapInfo, (LPATOL) (mpBitsSrc+bfoffBits),
mPos.x, mPos.y, Wid.x, Wid.y, DDF_BACKGROUNDPAL);
} else {
DrawDibDraw( m_hDrawDib, (),
0, 0, (), (),
mpBitmapInfo, (LPATOL) (mpBitsSrc+bfoffBits),
0, 0, mpBitmapInfo- >biWidth, mpBitmapInfo- >biHeight,
DDF_BACKGROUNDPAL);
}
}
return;
}

发表评论

电子邮件地址不会被公开。 必填项已用*标注