为什么用StretchBlt缩放后,再用GetBitmapBits取出来的数据就不对了?
我gdi很差,还请高手指点!(最好写几行代码!不要用getpixel,要用GetBitmapBits)
下面代码要对hbmLoaded缩放为ArrayHeight*ArrayWidth后再取出数据存到pBuf中
HDC hdc,SrcDC,DstDC;
hdc=GetDC(0);
SrcDC=CreateCompatibleDC(hdc);
DstDC=CreateCompatibleDC(hdc);HBITMAP hbm1; //拉伸后的位图句柄
hbm1=CreateCompatibleBitmap(DstDC,ArrayWidth,ArrayHeight);
SelectObject(SrcDC,hbmLoaded);
SelectObject(DstDC,hbm1); //装入DCStretchBlt(DstDC,0,0,ArrayWidth,ArrayHeight,SrcDC,0,0,ImageWidth,ImageHeight,SRCCOPY);GetBitmapBits(hbm1, BufSize,(LPSTR)pBuf);//取出的数据不对,一堆不知什么东西DeleteObject(hbm1);
DeleteObject(hbmLoaded);
DeleteDC(DstDC);
DeleteDC(SrcDC);
ReleaseDC(0,hdc);
我gdi很差,还请高手指点!(最好写几行代码!不要用getpixel,要用GetBitmapBits)
下面代码要对hbmLoaded缩放为ArrayHeight*ArrayWidth后再取出数据存到pBuf中
HDC hdc,SrcDC,DstDC;
hdc=GetDC(0);
SrcDC=CreateCompatibleDC(hdc);
DstDC=CreateCompatibleDC(hdc);HBITMAP hbm1; //拉伸后的位图句柄
hbm1=CreateCompatibleBitmap(DstDC,ArrayWidth,ArrayHeight);
SelectObject(SrcDC,hbmLoaded);
SelectObject(DstDC,hbm1); //装入DCStretchBlt(DstDC,0,0,ArrayWidth,ArrayHeight,SrcDC,0,0,ImageWidth,ImageHeight,SRCCOPY);GetBitmapBits(hbm1, BufSize,(LPSTR)pBuf);//取出的数据不对,一堆不知什么东西DeleteObject(hbm1);
DeleteObject(hbmLoaded);
DeleteDC(DstDC);
DeleteDC(SrcDC);
ReleaseDC(0,hdc);
DDB位图数据由硬件决定
所以对你来说是“一堆不知什么东西”
应该用GetDIBits得到DIB位图数据
这个问题可能我没有说清。以前我是这样写的:
LoadImage从bmp文件读取。再用GetBitmapBits就可得到正确的数据(我已经分析了它们为三分色,并将它们整理到数组中了)。
但是现在我要将从文件中读出的位图进行缩放,再获取它的像素数据。我想只要在LoadImage与GetBitmapBits之间加一个stretchBlt就行了吧。但不行。第二,我想问一个小问题。您说GetBitmapBits得到的是ddb。但不知道为什么在csdn中找到GetBitmapBits之中没有说到ddb。不过我倒是在GetDibBits函数之中找该函数的参数必须为ddb的HBITMAP(位图句柄)。还请大侠多多帮助!感激不尽!
如果像您说的:"应该用GetDIBits得到DIB位图数据"
我用GetBitmapBits应该读不出正确的数据。
但实际情况是我已经用GetBitmapBits正确的读取数据。并对其分析,保存到数组了。
只是要对图像缩放后再取数据,出了问题。
第二,我查到hbitmap可以是ddb的句柄,也可以是dib的句柄。也许您说的是LoadImage返回的是ddb的句柄吧。
zy910:
HBITMAP就是DDB
=======================to zyl910你说的什么乱七八糟啊!
ddb设备相关位图
dib设备无关位图
hbitmap位图句柄你的星怎么倒来的。