DDraw的问题:如何缩放图像? 已创建好一个固定大小的显示平面,现在有一大小不定(可能比平面指定的大小大,也可能小)的图像数据,需要将此图像数据进行缩放,然后复制到平面中,以实现显示。请问该如何进行上述操作?如果我的描述不清,请指出,我将在线进行解答。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 利用CDC的这个函数是可以,不过建立两个平面,取得DC,再缩放。我试了一下,它的效率太低下了,慢得人受不了。我想,DDRAW应该有它的缩放函数吧,如果硬件支持的话,又何必要软件缩放呢?高手们说呢? 在后台缓冲区中载入一个位图文件 一旦DirectDrawPalette对象被嵌入到DirectDrawSurface对象之中,DDEX2就将Back.bmp位图载入到后台缓冲区中。使用下例的程序代码可实现该过程: // Load a bitmap into the back buffer. ddrval = DDReLoadBitmap(LpDDSBack, szBackground); if( ddrval != DD_Ok ) // Load failed DDReLoadBitmap是出现在Ddutil.cpp中的另一个函数。它从一个文件或资源中将一个位图文件载入到一个已经存在的DirectDraw表面之中。(就像在DDEX5中那样,你可以使用DDLoadBitmap创造一个表面并且将位图载入那个表面。对于DDEX2来说,DDReLoadBitmap把szBackground指向的Back.bmp载入到ipDDSBack指向的后台缓冲区,DDReLoadBitmap调用DDCopyBitmap函数,将文件复制到后台缓冲区中,并且将缓冲区扩展到适当的。DDCopyBitmap函数将位图复制到内存之中,然而利用GetObject函数得到位图的大小。DDCopyBitmap然后使用下列的代码得到后台缓冲区的大小(它可以放置位图): // // get size of surface // ddsd.dwSize = sizeof(ddsd); ddsd.dwFlags = DDSD_HEIGHT DDSD_WIDTH; lpdds->GetSurfaceDesc(&ddsd); ddsd是指向DDSRFACEDESC结构的一个指针。该结构存储了DirectDraw表面的当前描述。在这种情况下,我们需要注意的是:DDSURFACEDESC的成员描述这个表面的高度和宽度,分别表示为:DDSD_HEIGHT和DDSD_WIDTH。调用IDirectDrawSurface::GetSurfaceDesc方法,把适当的值来载入到这个结构。对于DDEX2来说,这些值将是:高480和宽640。DDCopyBitmap函数锁定表面并将位图文件复制到后台缓冲区,使用StretchBit函数延伸或压缩后台缓冲区到可适用的大小。表示如下: if((hr = lpdds->GetDC(&hdc)) == DD_OK) { StretchBlt(hdc, 0,0,ddsd.dwWidth, ddsd.dwHeight, hdcImage,x, y, dx, dy, SRCCOPY);//StretchBlt就可以缩放 lpdds->ReleaseDC(hdc); } 其实,最简单的就是:直接BLT函数就可以实现了,我真是笨到家了。不过,还是谢谢诸位。给分算了,反正分多了也没有什么用。 求vs6.0变成office2010界面的方法 急求视频分块的问题 长假归来,散分! 如何声明 DLL中 参数是 工作区 指针 的输出函数 ? 文件传输,会中断问题,在线等 关于查找定义???? 插入数据发生错误 线程与消息队列//我记的窗口不就一个消息队列吗? 学VC真是很累呀!! VC++ 字符串问题 [讨论]关于内存泄漏问题 请问:CArray<CPoint,CPoint&> newdate; 可以当成数组用么??
一旦DirectDrawPalette对象被嵌入到DirectDrawSurface对象之中,DDEX2就将Back.bmp位图载入到后台缓冲区中。使用下例的程序代码可实现该过程: // Load a bitmap into the back buffer.
ddrval = DDReLoadBitmap(LpDDSBack, szBackground);
if( ddrval != DD_Ok )
// Load failed DDReLoadBitmap是出现在Ddutil.cpp中的另一个函数。它从一个文件或资源中将一个位图文件载入到一个已经存在的DirectDraw表面之中。(就像在DDEX5中那样,你可以使用DDLoadBitmap创造一个表面并且将位图载入那个表面。对于DDEX2来说,DDReLoadBitmap把szBackground指向的Back.bmp载入到ipDDSBack指向的后台缓冲区,DDReLoadBitmap调用DDCopyBitmap函数,将文件复制到后台缓冲区中,并且将缓冲区扩展到适当的。DDCopyBitmap函数将位图复制到内存之中,然而利用GetObject函数得到位图的大小。DDCopyBitmap然后使用下列的代码得到后台缓冲区的大小(它可以放置位图): //
// get size of surface
//
ddsd.dwSize = sizeof(ddsd);
ddsd.dwFlags = DDSD_HEIGHT DDSD_WIDTH;
lpdds->GetSurfaceDesc(&ddsd); ddsd是指向DDSRFACEDESC结构的一个指针。该结构存储了DirectDraw表面的当前描述。在这种情况下,我们需要注意的是:DDSURFACEDESC的成员描述这个表面的高度和宽度,分别表示为:DDSD_HEIGHT和DDSD_WIDTH。调用IDirectDrawSurface::GetSurfaceDesc方法,把适当的值来载入到这个结构。对于DDEX2来说,这些值将是:高480和宽640。DDCopyBitmap函数锁定表面并将位图文件复制到后台缓冲区,使用StretchBit函数延伸或压缩后台缓冲区到可适用的大小。表示如下: if((hr = lpdds->GetDC(&hdc)) == DD_OK)
{
StretchBlt(hdc, 0,0,ddsd.dwWidth, ddsd.dwHeight, hdcImage,x, y, dx, dy, SRCCOPY);//StretchBlt就可以缩放
lpdds->ReleaseDC(hdc);
}