各位,不知道有没有人注意过,我用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()
发现两次的值不一样,有人知道为什么吗,赐教
r = c.GetR();g = c.GetG();b = c.GetB();
后来用
c = pDC->GetPixel(CPoint(i,j));
r = c.GetR();g = c.GetG();b = c.GetB()
发现两次的值不一样,有人知道为什么吗,赐教
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);
}
而是
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了。