StretchDIBits这个函数

谁用过StretchDIBits这个函数,能讲一下它的所有参数的用法,最好给出一个例子
--------------------------------------------------------------- StretchDIBits函数的功能是拷贝一个DIB中的某矩形区域中的像素的颜色数据到指定的矩形区域中,如果目的矩形区域的大小与源区域不相同,该函数会自动地进行伸展或压缩以使之适合显示。它的原型如下:

int StretchDIBits(
  HDC hdc,                      // 设备上下文句柄
  int XDest,                    // 目的区域左上角X轴坐标
  int YDest,                    // 目的区域左上角Y轴坐标
  int nDestWidth,               // 目的区域的宽度
  int nDestHeight,              // 目的区域的高度
  int XSrc,                     // 源区域左上角X轴坐标
  int YSrc,                     // 源区域左上角Y轴坐标
  int nSrcWidth,                // 源区域的宽度
  int nSrcHeight,               // 源区域的高度
  CONST VOID *lpBits,           // 指向位图的比特数据,即像素数据数组
  CONST BITMAPINFO *lpBitsInfo, // 位图头部信息的指针,包含了该DIB的信息
  UINT iUsage,                  // usage options
  DWORD dwRop                   // raster operation code
);

其中iUsage参数指定BITMAPINFO结构体中的bmiColors成员是否被提供,如果是的话,bmiColors是否包含了明确的RGB颜色还是颜色索引,如果该值指定为DIB_RGB_COLORS,则表示颜色表中包含的是明确的RGB颜色的值。

最后一个参数指定了源像素、目的设备上下文的当前画笔以及目的像素将以何种方式结合起来构成新的图像的表示。

下面是一个例子:

// TODO: Add your command handler code here
BOOL               bSuccess ;
DWORD              dwFileSize, dwHighSize, dwBytesRead ;
HANDLE             hFile ;
BITMAPFILEHEADER * pbmfh ;
BITMAPINFO       * pbmi ;
BYTE             * pBits ;
int                cxDib, cyDib ;

CString pstrFileName="c://mypic.bmp";

hFile = CreateFile (pstrFileName, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL) ;

if (hFile == INVALID_HANDLE_VALUE)
return ;

dwFileSize = GetFileSize (hFile, &dwHighSize) ;

if (dwHighSize)
{
CloseHandle (hFile) ;
return ;
}

pbmfh = (BITMAPFILEHEADER *)malloc (dwFileSize) ;
if (!pbmfh)
{
CloseHandle (hFile) ;
return ;
}

bSuccess = ReadFile (hFile, pbmfh, dwFileSize, &dwBytesRead, NULL) ;
CloseHandle (hFile) ;
if (!bSuccess || (dwBytesRead != dwFileSize)         
|| (pbmfh->bfType != * (WORD *) "BM") 
|| (pbmfh->bfSize != dwFileSize))
{
free (pbmfh) ;
return  ;
}
this->Invalidate();

if (pbmfh == NULL)
{
MessageBox (TEXT ("Cannot load DIB file"), 
"ShowDIB", MB_ICONEXCLAMATION | MB_OK) ;
return ;
}
// 取得位图信息结构体的指针和位图数据数组的指针

pbmi  = (BITMAPINFO *) (pbmfh + 1) ;
pBits = (BYTE *) pbmfh + pbmfh->bfOffBits ;

// Get the DIB width and height

if (pbmi->bmiHeader.biSize == sizeof (BITMAPCOREHEADER))
{
cxDib = ((BITMAPCOREHEADER *) pbmi)->bcWidth ;
cyDib = ((BITMAPCOREHEADER *) pbmi)->bcHeight ;
}
else
{
cxDib =      pbmi->bmiHeader.biWidth ;
cyDib = abs (pbmi->bmiHeader.biHeight) ;
}

PAINTSTRUCT               ps ;
HDC hdc = hdc = ::BeginPaint (this->GetSafeHwnd(), &ps) ;

CRect winrect;
this->GetClientRect(&winrect);
StretchDIBits (hdc, 0, 0, winrect.Width(), winrect.Height(), 
0, 0, cxDib, cyDib,
pBits, pbmi, DIB_RGB_COLORS, SRCCOPY) ;
::EndPaint (this->GetSafeHwnd(), &ps) ;

如果需要进一步的信息,您可以参看:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_1ppv.asp等有关的MSDN信息。


- 微软全球技术中心 VC技术支持

本贴子以“现状”提供且没有任何担保,同时也没有授予任何权利。具体事项可参见使用条款
(http://support.microsoft.com/directory/worldwide/zh-cn/community/terms_chs.asp)。

为了为您创建更好的讨论环境,请参加我们的用户满意度调查
(http://support.microsoft

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
使用StretchDIBits函数可以将一个DIB(Device Independent Bitmap,设备无关位图)的图像缩放并绘制到另一个DIB的指定位置,从而实现将两个图像合并的效果。下面是使用StretchDIBits函数绘制两个图像的示例代码: ```c++ HDC hdc = GetDC(hwnd); // 获取窗口设备上下文句柄 HDC hdcMem1 = CreateCompatibleDC(hdc); // 创建内存设备上下文句柄1 HDC hdcMem2 = CreateCompatibleDC(hdc); // 创建内存设备上下文句柄2 // 加载第一个图像 HBITMAP hBitmap1 = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP1)); SelectObject(hdcMem1, hBitmap1); // 加载第二个图像 HBITMAP hBitmap2 = LoadBitmap(hInstance, MAKEINTRESOURCE(IDB_BITMAP2)); SelectObject(hdcMem2, hBitmap2); // 获取第一个图像的宽度和高度 BITMAP bmp1; GetObject(hBitmap1, sizeof(BITMAP), &bmp1); int width1 = bmp1.bmWidth; int height1 = bmp1.bmHeight; // 获取第二个图像的宽度和高度 BITMAP bmp2; GetObject(hBitmap2, sizeof(BITMAP), &bmp2); int width2 = bmp2.bmWidth; int height2 = bmp2.bmHeight; // 创建目标DIB BITMAPINFO bmi = { 0 }; bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi.bmiHeader.biWidth = width1 + width2; bmi.bmiHeader.biHeight = max(height1, height2); bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biBitCount = 32; BYTE* pBits; HBITMAP hBitmap = CreateDIBSection(hdc, &bmi, DIB_RGB_COLORS, (void**)&pBits, NULL, 0); // 将第一个图像绘制到目标DIB的左侧 StretchDIBits(hdc, 0, 0, width1, height1, 0, 0, width1, height1, pBits, &bmi, DIB_RGB_COLORS, SRCCOPY); StretchDIBits(hdc, width1, 0, width2, height2, 0, 0, width2, height2, pBits + width1 * height1 * 4, &bmi, DIB_RGB_COLORS, SRCCOPY); // 释放资源 DeleteObject(hBitmap1); DeleteObject(hBitmap2); DeleteObject(hBitmap); DeleteDC(hdcMem1); DeleteDC(hdcMem2); ReleaseDC(hwnd, hdc); ``` 这段代码将两个位图合并成一个,第一个位图位于左侧,第二个位图位于右侧。你可以根据需要修改代码,将两个位图按照自己的需求合并。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值