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信息。 

 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 MFC 中,StretchDIBits 函数用于将设备无关位图(DIB)绘制到设备上,并按比例缩放。以下是使用 StretchDIBits 函数的基本步骤: 1. 创建一个 BITMAPINFO 结构,它描述了 DIB 的格式和颜色信息。 2. 创建一个指向 DIB 的指针,该 DIB 包含要绘制的图像数据。 3. 使用 CreateCompatibleDC 函数创建一个兼容设备上下文(DC)。 4. 使用 CreateCompatibleBitmap 函数创建一个与 DC 兼容的位图。 5. 使用 SelectObject 函数选择该位图作为 DC 的绘图对象。 6. 使用 StretchDIBits 函数将 DIB 绘制到位图上,并按比例缩放。 7. 使用 BitBlt 函数将位图绘制到设备上。 下面是一个简单的使用 StretchDIBits 函数的示例代码: ```c++ void CMyView::OnDraw(CDC* pDC) { // 创建一个 BITMAPINFO 结构 BITMAPINFO bmi = { 0 }; bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER); bmi.bmiHeader.biWidth = m_nWidth; bmi.bmiHeader.biHeight = m_nHeight; bmi.bmiHeader.biPlanes = 1; bmi.bmiHeader.biBitCount = 24; bmi.bmiHeader.biCompression = BI_RGB; // 创建一个指向 DIB 的指针 BYTE* pBits = GetDibBits(); // 创建一个兼容 DC CDC dcMem; dcMem.CreateCompatibleDC(pDC); // 创建一个兼容位图 CBitmap bmp; bmp.CreateCompatibleBitmap(pDC, m_nWidth, m_nHeight); CBitmap* pOldBmp = dcMem.SelectObject(&bmp); // 绘制 DIB 到位图上 StretchDIBits(dcMem.GetSafeHdc(), 0, 0, m_nWidth, m_nHeight, 0, 0, m_nWidth, m_nHeight, pBits, &bmi, DIB_RGB_COLORS, SRCCOPY); // 绘制位图到设备上 pDC->BitBlt(0, 0, m_nWidth, m_nHeight, &dcMem, 0, 0, SRCCOPY); dcMem.SelectObject(pOldBmp); } ``` 在上面的示例代码中,GetDibBits 函数返回一个指向 DIB 数据的指针。m_nWidth 和 m_nHeight 是 DIB 的宽度和高度。首先,我们创建了一个 BITMAPINFO 结构来描述 DIB 的格式和颜色信息。然后,我们创建了一个兼容 DC 和兼容位图,并将该位图作为 DC 的绘图对象。最后,我们使用 StretchDIBits 函数将 DIB 绘制到位图上,并使用 BitBlt 函数将位图绘制到设备上。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值