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 可能返回失败的原因!

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

MFC显示图片/StretchDIBits失真/显示倒了

打开图片获取RGB或者BGR数据后显示图片 CStatic* videoWall = (CStatic*)GetDlgItem(ID_VIDEO_WALL); 显示 CRect rc;...
  • lanmo555
  • lanmo555
  • 2014年02月10日 16:49
  • 2377

C++图像缩放(StretchBlt,StretchDIBits,双线性内插法)

VC++中自带的图像缩放函数两个: 1、 BOOL StretchBlt ( int x, int y, int nWidth, int nHeight, CDC* pSrcDC, i...
  • baidu_37503452
  • baidu_37503452
  • 2017年06月20日 13:44
  • 584

BMP文件的读取与显示

1.StretchDIBits函数实现 完成功能: 对话框程序,添加一个按钮,点击按钮后显示图片 (1)设置BYTE*m_pBmpData为类的成员变量,我们要把图片的RGB数据装进去。 (2...
  • u014568921
  • u014568921
  • 2015年07月14日 13:39
  • 2697

static函数与普通函数

原文:static函数与普通函数 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式, 静态全局变量当然也 是静态存储方式。这两者在存储方式上并无...
  • u010832643
  • u010832643
  • 2013年09月10日 10:47
  • 2137

构造函数与成员函数的区别?

构造函数是一种特殊的方法 主要用来在创建对象时初始化对象即为对象成员变量赋初始值 总与new运算符一起使用在创建对象的语句中 特别的一个类可以有多个构造函数 可根据其参数个数的不同或参数类型的不同...
  • daocaorencrl
  • daocaorencrl
  • 2015年05月15日 10:53
  • 1953

主题:钩子函数简析及实例

钩子函数、回调函数、注册函数,挂钩子这些我们代码中经常涉及到的东西,是否已经困扰你很久了?它们究竟是怎么回事,究竟怎么用?下面我来为你一一解答。 什么是钩子函数? 钩子函数也叫回调函数,是...
  • sunstars2009918
  • sunstars2009918
  • 2014年09月17日 11:41
  • 4299

匿名函数(Lambda表达式)与箭头函数

“Lambda 表达式”(lambda expression)是匿名函数的别称。 在ES6中,允许使用箭头=>定义匿名函数。var f = v => v;上面的箭头函数等同于:var f = fun...
  • maomaolaoshi
  • maomaolaoshi
  • 2017年10月26日 16:57
  • 280

为什么构造函数不能够使虚函数

虚函数可谓是C++与其它的面向对象语言最大的区别了。虚函数的存在使为了多态,Java当然也有多态。不过实现方式并不是通过虚函数,我们这里就不做介绍了。         虚函数的作用主要是为了继承的时...
  • helinlin007
  • helinlin007
  • 2016年05月30日 21:46
  • 6831

深度学习(1)-深度学习中的核函数(激活函数)

1.核函数的作用与损失函数的设计核函数(kernel method,kernel trick)是机器学习中一种重要的方法。一般定义是将原始表达转换到一个隐式特征空间去,该空间具有更好的特征可分性质。 ...
  • Kevin_cc98
  • Kevin_cc98
  • 2017年12月10日 15:36
  • 221
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章: StretchDIBits函数
举报原因:
原因补充:

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