某些应用程序缩放图像__,即显示图像的缩放或缩小视图。例如,绘图应用可以提供使得用户能够逐个像素地观看和编辑绘图的缩放特征。
应用程序通过调用StretchBlt功能缩放图像。像BitBlt功能一样,StretchBlt将位图数据从源DC中的位图复制到目标DC中的位图。但是,与BitBlt功能不同,StretchBlt将根据源和目标矩形的指定尺寸对图像进行缩放。如果源矩形大于目标矩形,则生成的图像将显示为缩小;如果源矩形小于目标矩形,则所得到的图像将显示为展开。
如果目标矩形小于源矩形,StretchBlt将根据指定的拉伸模式从图像中删除颜色数据,如下表所示。
拉伸模式 | 方法 |
BLACKONWHITE | 对已消除的像素的颜色数据和剩余像素的颜色数据执行逻辑AND运算。 |
WHITEONBLACK | 对所消除的像素的颜色数据和剩余像素的颜色数据执行逻辑“或”运算。 |
COLORONCOLOR | 彻底消除已删除像素的颜色数据。 |
HALFTONE | 近似目的地的原始(源)颜色数据。 |
通过调用SetStretchBltMode功能来设置拉伸模式。
以下示例代码从应用程序中获取,该应用程序以原始大小或原始大小的两倍显示图像。(此应用程序使用默认的拉伸模式。)
hdcScaled = CreateCompatibleDC(hdcScreen);
hbmScaled = CreateCompatibleBitmap(hdcScreen,
GetDeviceCaps(hdcScreen,HORZRES)* 2,
GetDeviceCaps(hdcScreen, VERTRES) * 2);
if (hbmScaled == 0)
errhandler("hbmScaled", hwnd);
/ *选择位图到兼容DC。*/
if(!SelectObject(hdcScaled,hbmScaled))
errhandler("Scaled Bitmap Selection", hwnd);
case WM_COMMAND: /* message: command from application menu */
开关(wParam){
case IDM_SCALEX1:
if(fBlt){
fScaled = FALSE;
hdcWin = GetDC(hwnd);
BitBlt(hdcWin,
0,0,
bmp.bmWidth,bmp.bmHeight,
hdcCompatible,
0,0,
SRCCOPY);
ReleaseDC(hwnd, hdcWin);
}
break;
case IDM_SCALEX2:
if(fBlt){
fScaled = TRUE;
StretchBlt(hdcScaled,
0, 0,
bmp.bmWidth * 2,bmp.bmHeight * 2,
hdcCompatible,
0, 0,
bmp.bmWidth,bmp.bmHeight,
SRCCOPY);
hdcWin = GetDC(hwnd);
BitBlt(hdcWin,
0,0,
bmp.bmWidth,bmp.bmHeight,
hdcScaled,
0,0,
SRCCOPY);
ReleaseDC(hwnd, hdcWin);
}
break;