我用如下方法得到内存DC的BITMAP数据:
HDC hScreenDC = NULL;
hScreenDC = GetDC(NULL);//屏幕DC
hMemDC = ::CreateCompatibleDC(hScreenDC);
if(hMemDC=NULL)
{return false;}
hBmp = ::CreateCompatibleBitmap(hScreenDC,nWidth,nHeight);
hOldBitmap = (HBITMAP)::SelectObject(hMemDC, hBmp);
::GetObject(hBmp,sizeof(bmRet),(LPSTR)&bmRet);
long lBufferSize = bmRet.bmWidthBytes*bmRet.bmHeight;
BYTE *pTempBuffer=NULL;
pTempBuffer = (BYTE *)VirtualAlloc(NULL, lBufferSize, MEM_COMMIT,PAGE_READWRITE);
if(pTempBuffer == NULL)
{
return false;
}
if(GetBitmapBits(hBmp, lBufferSize ,pTempBuffer)==0)//得到数据
{
VirtualFree(pTempBuffer, 0, MEM_RELEASE);
pTempBuffer = NULL;
return false;
}
if(hMemDC!=NULL)
{
   if(hOldBitmap)
    {
HBITMAP hbmp = NULL;
hbmp = (HBITMAP)::SelectObject(hMemDC, hOldBitmap);
if(hbmp)
{
          ::DeleteObject(hbmp);
hbmp = NULL;
}
::DeleteDC(hMemDC);
hMemDC=NULL;
    }
}ReleaseDC(NULL,hScreenDC);
....
bmRet.bmBitsPixel=24,GetBitmapBits得到的数据是BGR排列的,有什么办法能够使得到的数据是RGB排列?是不是怎么排列与显卡有关?
要是没有办法设定,有什么办法判断当前是BGR排列还是RGB排列欢迎讨论,如果我没说清楚,请提出来
分不是问题,不够再加,up有分!!

解决方案 »

  1.   

    文件里存的是BGR
    用GetBitmapBits也应该是吧
      

  2.   

    我得到数据后还要另存为Tiff文件,如果是BGR的话,我在存之前还要转一下,觉得如果得到的就是RGB的话,就可以省一个步骤,省时省空间而且我碰到过,如果得到打印机dc,得到的有可能是RGB排列的,如果不能设定,有个方法判断也行啊
      

  3.   

    你可以先华一个点,这个点RGB是1,2,3
    然后你用GetBitmapBits来得到数据
    然后就可以判断了~
    可能麻烦了点
      

  4.   

    标准bmp的排列就是BGR的,GetBitmapBits得到的数据不可能变成RGB,楼主还是写个转换函数吧,很简单,就是把得到的数据1、3,5、7这样调换就可以了,费不了你什么时间。
      

  5.   

    之前我也以为是标准bmp的排列就是BGR的,转换函数我也写了,可是我最近碰到一个RGB排列的,
    thisisll(速度八十迈) 的方法应该是可行的,只要setpixel,getpixel就行了,没简单的方法吗?
      

  6.   

    还是用GetPixel吧GetRValue
    GetGValue
    GetBValue