比bitblt和stretchblt效率更高的函数

BMP位图用锉锉安排和柔软的缩放
—- 经过对BMP位图显示的经用办法,占内存大,迅速前行慢,紧缩制紧缩图形,令人伤心或痛苦的变形,在低色位数的修理上显示高色位数的图形图形时变形大。本文敷录像磁带效能,显示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位图通讯头通讯的位图的大小人。
typedef struct tagBITMAPINFOHEADER{
DWORD biSize; // 的音节数的安排
LONGbiWidth; // 位图的宽度,以像素为单位
LONGbiHeight; // 位图的高压地带,以像素为单位
WORD biPlanes; // 目的修理的程度,霉臭是1
WORD biBitCount// 需求每像素的位数,霉臭是1(一色),
// 4(16色),8(256色)或24(真一色)的
DWORD biCompression; // 位图的紧缩典型,霉臭是 0(不紧缩),
// 1(bi_rle8紧缩型)或2(其正中鹄的bi_rle4紧缩型)
DWORD biSizeImage; // 位图的大小人,以音节为单位
LONGbiXPelsPerMeter; // 程度析像系数的位图,每米的像素数
LONGbiYPelsPerMeter; // 铅直析像系数的位图,每米的像素数
DWORD biClrUsed;// 位图现实敷的色表正中鹄的色数
DWORD biClrImportant;// 在位图显示进行中要紧的色数
} BITMAPINFOHEADER;
—- 4. 色表
—- 一色位图的色表,它有非常入场,每个表项是一个人色表项式安排,界限一种色。色表项安排界限列举如下
typedef struct tagRGBQUAD {
BYTErgbBlue;// 蓝色的明亮(类别为0-255)
BYTErgbGreen; // 绿色的明亮(类别为0-255)
BYTErgbRed; // 白色的明亮(类别为0-255)
BYTErgbReserved;// 保存,霉臭是0
} RGBQUAD;
在色表项表标明安排的色来决定bibitc数
当biBitCount=1,4,8时,有2个,16,256个表项;
当biBitCount=24时,缺少色表项。
位图通讯头和一色位图通讯表。,BITMAPINFO安排界限列举如下
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,
—- SelectBitmap()选择显示位图。
—- 4. 用BitBlt或StretchBlt等作用显示位图
—- 5. DeleteObject(自成一格准备位图)
—- 前述的办法是 1)显示迅速前行 2) 内存占据期间大; 3) 位图变形时显示缩减。,(可以经过变硬剧本、广播稿或者电影剧本柔软的软件处置) 4) 在低色位数的修理上(如256显示模特儿)显示高色位数的图形(如真一色)图形令人伤心或痛苦的变形。
—- 三、缩放显示位图
—- 敷DrawDib作用显示位图图像,更少的内存占据期间,迅速前行快,同时对水变弱的图形(震动)的纠正。水变弱是一种图形化的算法,可用于显示一色图像比图像的色是用来缩减修理。BMP位图的显示办法列举如下
—- 1. 翻开录像磁带效能drawdibopen,普通在安排作用
—- 2. 贮存器量用于贮存器位图用锉锉的敷
—- GlobalAlloc(GHND,用锉锉测量法)
—- 3. 读取位图用锉锉的贮存器空间
—- LoadFileToMemory( mpBitsSrc,mFileName);
—- 4. 在OnPaint作用在drawdibrealize,(drawdibdraw)显示位图
—- 5. 关店录像磁带效能drawdibclose,在析构作用普通
—- 前述的办法的优点是 1)显示迅速前行 2) 更少的内存占据期间; 3) 小变形图形显示快速上升的,4) 在低色位数的修理上显示高色位数的图形图形时变形小; 5) 经过坦率地处置位图标明,可以生产简略的讽刺画。
—- 四、cviewbimap程序要点
—- 1. 在cviewbimap类中添加录像磁带效能的会员
HDRAWDIB m_hDrawDib; // 录像磁带作用
HANDLEmhBitsSrc; // 位图用锉锉句柄(内存)
LPSTR mpBitsSrc; // 位图用锉锉地址(内存)
BITMAPINFOHEADER *mpBitmapInfo; // 位图通讯头
—- 2. 在cviewbimap类安排作用添加翻开录像磁带效能
—- m_hDrawDib= DrawDibOpen();
—- 3. 在cviewbimap类析构作用添加关店录像磁带效能
if( m_hDrawDib != null)
{
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); // 选择物体
// 严格意义上的的会员 mdispr是用来表现图形显示区域的大小人。
// CPoint的会员 mPos用于指令图形显示幼芽放置使动作协调.
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)
{
// 显示一色位图
::BitBlt(,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, (值) (mpBitsSrc+bfoffBits),
mPos.x, mPos.y, Wid.x, Wid.y, DDF_BACKGROUNDPAL);
} else {
DrawDibDraw( m_hDrawDib, (),
0, 0, (), (),
mpBitmapInfo, (值) (mpBitsSrc+bfoffBits),
0, 0, mpBitmapInfo- >biWidth, mpBitmapInfo- >biHeight,
DDF_BACKGROUNDPAL);
}
}
return;
}

发表评论

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