为什么用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);

解决方案 »

  1.   

    GetBitmapBits得到的是DDB位图数据
    DDB位图数据由硬件决定
    所以对你来说是“一堆不知什么东西”
    应该用GetDIBits得到DIB位图数据
      

  2.   

    对不起zyl910!
    这个问题可能我没有说清。以前我是这样写的:
    LoadImage从bmp文件读取。再用GetBitmapBits就可得到正确的数据(我已经分析了它们为三分色,并将它们整理到数组中了)。
    但是现在我要将从文件中读出的位图进行缩放,再获取它的像素数据。我想只要在LoadImage与GetBitmapBits之间加一个stretchBlt就行了吧。但不行。第二,我想问一个小问题。您说GetBitmapBits得到的是ddb。但不知道为什么在csdn中找到GetBitmapBits之中没有说到ddb。不过我倒是在GetDibBits函数之中找该函数的参数必须为ddb的HBITMAP(位图句柄)。还请大侠多多帮助!感激不尽!
      

  3.   

    哎呀!这回这个问题就不好说了!
    如果像您说的:"应该用GetDIBits得到DIB位图数据"
    我用GetBitmapBits应该读不出正确的数据。
    但实际情况是我已经用GetBitmapBits正确的读取数据。并对其分析,保存到数组了。
    只是要对图像缩放后再取数据,出了问题。
    第二,我查到hbitmap可以是ddb的句柄,也可以是dib的句柄。也许您说的是LoadImage返回的是ddb的句柄吧。
      

  4.   

    这个问题我已经解决了!谢谢zyl910。
      

  5.   

    ===============================
    zy910:
    HBITMAP就是DDB
    =======================to zyl910你说的什么乱七八糟啊!
    ddb设备相关位图
    dib设备无关位图
    hbitmap位图句柄你的星怎么倒来的。