位图载入内存DC中,如何读DC中像素点的颜色? RTGetPixel无用 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 hwnd=::GetDesktopWindow(); hdc =::GetDC(hwnd); i=::GetDeviceCaps(hdc,HORZRES); j=::GetDeviceCaps(hdc,VERTRES); mdc=::CreateCompatibleDC(hdc); bitmap=::CreateCompatibleBitmap(hdc,i,j); oldbitmap=(HBITMAP)SelectObject(mdc,bitmap); ::BitBlt(mdc,0,0,i,j,hdc,0,0,SRCCOPY); cout<<hdc<<" "<<i<<" "<<j<<" "; for(i;i>=0;i--) for(j;j>=0;j--) if(GetPixel(mdc,i,j)!=0xffffffff) cout<<GetPixel(mdc,i,j)<<endl; GetPixel返回值是多少你可以用GetDIBits得到位图的数据 CreateDIBSection 用这个函数生成一个位图载入内存,获得一个以图片颜色数据写成的缓冲区的指针。可以通过计算得到某点的颜色,大概这样能解决。试试 查了无数资料,纠结了一整天终于有点头绪了,希望对其他人有帮助。 HDC hdc,mdc; HWND hwnd; int i,j; HBITMAP bitmap,oldbitmap; BITMAPINFO bi; RGBTRIPLE* rp; //表示颜色的结构,3个字节,在24位真彩色中分别是B,G,R BITMAPINFOHEADER bih;//位图文件头的信息,以下有初始化 VOID *lpBits; //用于指向位图数据缓冲区的指针由CreateDIBSection函数第四个参数返回,用B,G,R三个字节表示 hwnd=::GetDesktopWindow(); hdc =::GetDC(hwnd); //获取整个屏幕的HDC i=::GetDeviceCaps(hdc,HORZRES); j=::GetDeviceCaps(hdc,VERTRES); bih.biSize=sizeof(BITMAPINFOHEADER); bih.biWidth=i; bih.biHeight=j; bih.biPlanes=1; bih.biBitCount=24; bih.biCompression=BI_RGB; bih.biSizeImage=i*j; bih.biClrUsed=0; bih.biClrImportant=0; bi.bmiHeader=bih; mdc=::CreateCompatibleDC(hdc);//创建一个屏幕兼容的内存DC bitmap=CreateDIBSection(hdc,&bi,DIB_RGB_COLORS,&lpBits,NULL,0); oldbitmap=(HBITMAP)SelectObject(mdc,bitmap); ::BitBlt(mdc,0,0,i,j,hdc,0,0,SRCCOPY);//位图载入 rp=(RGBTRIPLE*)lpBits;//缓冲区指针传递给RGBTRIPLE型 COLORREF color=quse(rp,776,333); //比如返回某点坐标的颜色 cout<<(int)GetRValue(color)<<" "<<(int)GetGValue(color)<<" "<<(int)GetBValue(color); ::SelectObject(mdc,oldbitmap); ::DeleteDC(mdc); ::DeleteDC(hdc); ::DeleteObject(bitmap); ::CloseHandle(hwnd); 基本上算是实现了目标。因为装入缓冲区时是从位图的左下角的第一个像素点开始,先从左到右,再从下到上,最后装入右上角的最后一个像素点。以下是取缓冲区颜色的函数。 //取某一个坐标在位图中的颜色,返回COLORREF型,假设的分辨率是1440,900COLORREF quse(RGBTRIPLE *rp,const long x, const long y){ long n,i; i=899-y; n=1440*i+x; return RGB(rp[n].rgbtRed,rp[n].rgbtGreen,rp[n].rgbtBlue);} 画不规则控件的问题 急等 用VC实现html到txt的转换 系统自带gridctrl(grid32.ocx)问题 出来乍到的裸求 高分求教:关于ACM音频压缩的格式问题 我怎样将一个win32 SDK程序变为ActiveX控件? 如何能得到屏幕得高度和宽度 怎么取成员变量的函数作为beginthread的线程函数? 有关openGL代码的书写问题 :难,太难,100分送上 Win32如何创建对话框?创建后如何设置大小等样式? 求指点。。。
hdc =::GetDC(hwnd);
i=::GetDeviceCaps(hdc,HORZRES);
j=::GetDeviceCaps(hdc,VERTRES);
mdc=::CreateCompatibleDC(hdc);
bitmap=::CreateCompatibleBitmap(hdc,i,j);
oldbitmap=(HBITMAP)SelectObject(mdc,bitmap);
::BitBlt(mdc,0,0,i,j,hdc,0,0,SRCCOPY);
cout<<hdc<<" "<<i<<" "<<j<<" ";
for(i;i>=0;i--)
for(j;j>=0;j--)
if(GetPixel(mdc,i,j)!=0xffffffff)
cout<<GetPixel(mdc,i,j)<<endl;
你可以用GetDIBits得到位图的数据
HDC hdc,mdc;
HWND hwnd;
int i,j;
HBITMAP bitmap,oldbitmap;
BITMAPINFO bi;
RGBTRIPLE* rp; //表示颜色的结构,3个字节,在24位真彩色中分别是B,G,R
BITMAPINFOHEADER bih;//位图文件头的信息,以下有初始化
VOID *lpBits; //用于指向位图数据缓冲区的指针由CreateDIBSection函数第四个参数返回,用B,G,R三个字节表示
hwnd=::GetDesktopWindow();
hdc =::GetDC(hwnd); //获取整个屏幕的HDC
i=::GetDeviceCaps(hdc,HORZRES);
j=::GetDeviceCaps(hdc,VERTRES);
bih.biSize=sizeof(BITMAPINFOHEADER);
bih.biWidth=i;
bih.biHeight=j;
bih.biPlanes=1;
bih.biBitCount=24;
bih.biCompression=BI_RGB;
bih.biSizeImage=i*j;
bih.biClrUsed=0;
bih.biClrImportant=0;
bi.bmiHeader=bih;
mdc=::CreateCompatibleDC(hdc);//创建一个屏幕兼容的内存DC
bitmap=CreateDIBSection(hdc,&bi,DIB_RGB_COLORS,&lpBits,NULL,0);
oldbitmap=(HBITMAP)SelectObject(mdc,bitmap);
::BitBlt(mdc,0,0,i,j,hdc,0,0,SRCCOPY);//位图载入
rp=(RGBTRIPLE*)lpBits;//缓冲区指针传递给RGBTRIPLE型
COLORREF color=quse(rp,776,333); //比如返回某点坐标的颜色
cout<<(int)GetRValue(color)<<" "<<(int)GetGValue(color)<<" "<<(int)GetBValue(color);
::SelectObject(mdc,oldbitmap);
::DeleteDC(mdc);
::DeleteDC(hdc);
::DeleteObject(bitmap);
::CloseHandle(hwnd);
基本上算是实现了目标。因为装入缓冲区时是从位图的左下角的第一个像素点开始,先从左到右,再从下到上,最后装入右上角的最后一个像素点。以下是取缓冲区颜色的函数。 //取某一个坐标在位图中的颜色,返回COLORREF型,假设的分辨率是1440,900
COLORREF quse(RGBTRIPLE *rp,const long x, const long y)
{
long n,i;
i=899-y;
n=1440*i+x;
return RGB(rp[n].rgbtRed,rp[n].rgbtGreen,rp[n].rgbtBlue);
}