StretchDIBits函数

原创 2007年09月28日 10:00:00

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

 

相关文章推荐

StretchDIBits函数显示RGB数据流图像

  • 2016年08月27日 18:42
  • 56.39MB
  • 下载

StretchDIBits这个函数

谁用过StretchDIBits这个函数,能讲一下它的所有参数的用法,最好给出一个例子---------------------------------------------------------...

StretchDIBits函数(来自MSDN:StretchDIBits Function)

The StretchDIBits function copies the color data for a rectangle of pixels in a DIB, JPEG, or PNG im...

StretchDIBits 使用说明 例程

  • 2012年05月20日 13:35
  • 6KB
  • 下载

StretchDIBits速度测试(HALFTONE)

StretchDIBits速度测试(HALFTONE) 下面实验中显示窗口大小为1024*768,拉伸模式设为HALFTONE. 一、单通道图像 (1) 保持图像高度为1024,宽度从24到20...

关于StretchDIBits 可能返回失败的原因!

如果自己在加载图片是返回值为0,但是自己又找不出来错误,你就得注意StrechDIBits函数本身的限制问题了。它仅可以192k byte的内存空间,如果你的图像大小大于这个值,你可以将图像缩小,测试...
  • zzzqdl
  • zzzqdl
  • 2015年07月17日 15:02
  • 465

StretchDIBits的理解

该函数将DIB中矩形区域内像素使用的颜色数据拷贝到指定的目标矩形中。如果目标矩形比源矩形大小要大,那么函数对颜色数据的行和列进行拉伸,以与目标矩形匹配。如果目标矩形大小要比源矩形小,那么该函数通过使用...

VC++:SetDIBitsToDevice 及StretchDIBits

SetDIBitsToDevice :该函数使用DIB位图和颜色数据对与目标设备环境相关的设备上的指定矩形中的像素进行设置。 StretchDIBits 函数将DIB中矩形区域内像素使用的颜色数...

利用StretchDIBits、CreateDIBSection、CreateDIBitmap三种方法显示内存位图

// GDI //读取文件 CFile file("D:\\1.bmp",CFile::modeRead); char* bmpbuf = new char[file.GetL...

浅谈MFC中BitBlt与StretchDIBits的区别

一、基础知识1.BitBlt BitBlt 用于从原设备中复制位图到目标设备,语法格式如下: BOOL BitBlt( HDC hdcDest, // handle to destination...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章: StretchDIBits函数
举报原因:
原因补充:

(最多只允许输入30个字)