各位,不知道有没有人注意过,我用gdi+做程序,读入一个24位的图片,先用pBitmap->GetPixel(i,j,&c);
r = c.GetR();g = c.GetG();b = c.GetB();
后来用
c = pDC->GetPixel(CPoint(i,j));
r = c.GetR();g = c.GetG();b = c.GetB()
发现两次的值不一样,有人知道为什么吗,赐教

解决方案 »

  1.   

    怎么会呢?获得RGB值的代码:
    void CCreateRandomBMPDlg::OnBtnTest() 
    {
    // TODO: Add your control notification handler code here
    HBITMAP hBmp;

    CFileDialog dlg(TRUE,"bmp",NULL,0,"位图文件 (*.bmp)|*.bmp||",this);

    if(dlg.DoModal() != IDOK)
    {
    return;
    }

    hBmp = (HBITMAP)LoadImage(NULL,dlg.GetPathName(),IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);

    if(hBmp == NULL)
    {
    return;
    }

    BITMAP bm;
    PBITMAPINFO bmpInf;

    if(GetObject(hBmp,sizeof(bm),&bm)==0)
    return ;

    int nPaletteSize=0;

    if(bm.bmBitsPixel<16)
    nPaletteSize=(int)pow(2,bm.bmBitsPixel);

    bmpInf=(PBITMAPINFO)LocalAlloc(LPTR,sizeof(BITMAPINFOHEADER)+
    sizeof(RGBQUAD)*nPaletteSize);

    //-----------------------------------------------
    bmpInf->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
    bmpInf->bmiHeader.biWidth = bm.bmWidth;
    bmpInf->bmiHeader.biHeight = bm.bmHeight;
    bmpInf->bmiHeader.biPlanes = bm.bmPlanes;
    bmpInf->bmiHeader.biBitCount = bm.bmBitsPixel;
    bmpInf->bmiHeader.biCompression = BI_RGB;
    bmpInf->bmiHeader.biSizeImage = (bm.bmWidth+7)/8*bm.bmHeight*bm.bmBitsPixel;
    bmpInf->bmiHeader.biXPelsPerMeter = 0;
    bmpInf->bmiHeader.biYPelsPerMeter = 0;
    bmpInf->bmiHeader.biClrUsed = 0;
    bmpInf->bmiHeader.biClrImportant = 0;
    //-----------------------------------------------

    HDC hDC = ::GetWindowDC(NULL);
    if(!::GetDIBits(hDC,hBmp,0,(WORD)bm.bmHeight,NULL,bmpInf,DIB_RGB_COLORS))
    {
    LocalFree(bmpInf);
    ::ReleaseDC(NULL,hDC);
    return ;
    }

    void* buf=(void*) new char[bmpInf->bmiHeader.biSizeImage];
    if(buf==NULL)
    {
    ::ReleaseDC(NULL,hDC);
    LocalFree(bmpInf);
    return ;
    }

    if(!::GetDIBits(hDC,hBmp,0,(UINT)bm.bmHeight,buf,bmpInf,DIB_RGB_COLORS))
    {
    ::ReleaseDC(NULL,hDC);
    delete []buf;
    LocalFree(bmpInf);
    return ;
    }

    ::ReleaseDC(NULL,hDC);

    CString sMsg;
    sMsg.Format("BitsPixel:%d,width:%d,height:%d",
    bm.bmBitsPixel,bm.bmWidth,bm.bmHeight
    );

    AfxMessageBox(sMsg);

    CClientDC dc(this);

    if(bm.bmBitsPixel == 8)
    {
    BYTE *pData = (BYTE*)buf;

    int nWidth = bm.bmWidth;
    while(nWidth %4 != 0)
    {//Bmp每行数据都是4个字节的整数倍。
    nWidth++;
    }

    for(int i=0; i<bm.bmHeight; i++)
    {
    for(int j=0; j<bm.bmWidth; j++)
    {
    RGBQUAD rgbQ;
    rgbQ = bmpInf->bmiColors[pData[i*nWidth+j]];
    dc.SetPixel(j,bm.bmHeight-i,RGB(rgbQ.rgbRed,rgbQ.rgbGreen,rgbQ.rgbBlue));
    }
    }
    }
    else if(bm.bmBitsPixel == 16)
    {
    BYTE *pData = (BYTE*)buf;

    int nWidth = bm.bmWidth*2;
    while(nWidth %4 != 0)
    {
    nWidth++;
    }

    BYTE red,green,blue;

    for(int i=0; i<bm.bmHeight; i++)
    {
    for(int j=0; j<bm.bmWidth; j++)
    {
    blue = pData[i*nWidth+j*2]&0x1F;
    green = pData[i*nWidth+j*2]>>5;
    green |= (pData[i*nWidth+j*2+1]&0x03)<<3;
    red = (pData[i*nWidth+j*2+1]>>2)&0x1F;

    WORD wRed = red*8;
    WORD wBlue = blue*8;
    WORD wGreen = green*8;

    red = min(255,wRed);
    blue = min(255,wBlue);
    green = min(255,wGreen);

    dc.SetPixel(j,bm.bmHeight-i,RGB(red,green,blue));
    }
    }
    }
    else if(bm.bmBitsPixel == 24)
    {
    BYTE *pData = (BYTE*)buf;

    int nWidth = bm.bmWidth*3;
    while(nWidth %4 != 0)
    {
    nWidth++;
    }

    for(int i=0; i<bm.bmHeight; i++)
    {
    for(int j=0; j<bm.bmWidth; j++)
    {
    dc.SetPixel(j,bm.bmHeight-i,
    RGB(pData[i*nWidth+j*3+2],
    pData[i*nWidth+j*3+1],
    pData[i*nWidth+j*3]));
    }
    }
    }
    else if(bm.bmBitsPixel == 32)
    {
    BYTE *pData = (BYTE*)buf;

    int nWidth = bm.bmWidth*4;

    for(int i=0; i<bm.bmHeight; i++)
    {
    for(int j=0; j< bm.bmWidth; j++)
    {
    //注意这里的RGB
    dc.SetPixel(j,bm.bmHeight-i,
    RGB(pData[i*nWidth+j*4+2],
    pData[i*nWidth+j*4+1],
    pData[i*nWidth+j*4]));
    }
    }
    }

    delete []buf;

    DeleteObject(hBmp);
    LocalFree(bmpInf);

    }
      

  2.   

    GDI+中是用CBitmp类的,不是用hBmp = (HBITMAP)LoadImage(NULL,dlg.GetPathName(),IMAGE_BITMAP,0,0,LR_LOADFROMFILE|LR_CREATEDIBSECTION);
    而是
    Color c;
    BYTE r,g,b;
    for( int j = 0; j < lHeight; j++)
    {
    for( int i = 0; i < lWidth; i++)
    {
    c = pDC->GetPixel(CPoint(i,j));
    r = c.GetR();
    g = c.GetG();
    b = c.GetB(); pBitmap->GetPixel(i,j,&c);
    r = c.GetR();
    g = c.GetG();
    b = c.GetB();
    ....
    值不同,可以试一下,我当然没有覆盖DC了。
      

  3.   

    调试得时候当然不一样,必须打出来再看,调试时窗口位图已经被erase了