MFC怎样扫描bmp图像,辨别RGB值得到其坐标位置? 20

我现在有一张黑底bmp图,上面有个白点,我想辨别bmp的RGB值得到这个白点的x、y坐标位置,应该怎么做?MFC里面做得~谢谢了~想了一下午都没头绪~... 我现在有一张黑底bmp图,上面有个白点,我想辨别bmp的RGB值得到这个白点的x、y坐标位置,应该怎么做?MFC里面做得~

谢谢了~想了一下午都没头绪~
展开
 我来答
纱布爽
2011-05-24 · TA获得超过468个赞
知道答主
回答量:262
采纳率:0%
帮助的人:0
展开全部
位图在磁盘上吗?位图是灰阶的吗?
在的话用程序读进来。定位数据区,然后用for循环搜索匹配就行了啊。
BITMAPFILEHEADER* DibLoadImage(const char* pstrFileName)
{
BOOL bSuccess;
DWORD dwFileSize,dwBytesRead;
HANDLE hFile;
BITMAPFILEHEADER* pbmfh;
hFile=CreateFile(pstrFileName,GENERIC_READ,FILE_SHARE_READ,NULL,
OPEN_EXISTING,FILE_FLAG_SEQUENTIAL_SCAN,NULL);
if(hFile==INVALID_HANDLE_VALUE)
return NULL;
dwFileSize=GetFileSize(hFile,0);
pbmfh=(BITMAPFILEHEADER*)malloc(dwFileSize);
if(!pbmfh)
{
CloseHandle(hFile);
return NULL;
}
bSuccess=ReadFile(hFile,pbmfh,dwFileSize,&dwBytesRead,NULL);
CloseHandle(hFile);
return pbmfh;

}

void CNewbmpView::OnShow()
{
using namespace std;

string file_name_filter("BMP File(*.bmp)|*.bmp|");
string file_name;
CFileDialog file_open_dlg(true,"BMP","*.BMP",OFN_OVERWRITEPROMPT,file_name_filter.c_str());

if(IDOK==file_open_dlg.DoModal())
{
file_name=file_open_dlg.GetPathName();
}

if(!file_name.length()) return;
m_filename=file_name;

fstream io_bitmap_file(file_name.c_str(),ios::in|ios::out);
if(!io_bitmap_file){
cerr<<"对不起,无法打开文件 \" "<<file_name<<"\""<<endl;
exit(EXIT_FAILURE);
}

BITMAPFILEHEADER bmp_file_header;
io_bitmap_file.read((LPSTR)&bmp_file_header,sizeof(bmp_file_header));
if(bmp_file_header.bfType!=((WORD)('M'<<8)|'B'))
return;
BITMAPINFOHEADER bmp_info_header;
io_bitmap_file.read((LPSTR)&bmp_info_header,sizeof(bmp_info_header));

Matrix matrix;
matrix.n_row=bmp_info_header.biHeight;
matrix.n_col=bmp_info_header.biWidth;
matrix.n_pixel=abs(matrix.n_col*matrix.n_row);
io_bitmap_file.clear();
io_bitmap_file.close();

unsigned char hBitMapInfo[sizeof(BITMAPINFOHEADER)+sizeof(RGBQUAD)* 256];
BITMAPINFO *bmp_info=(BITMAPINFO *) hBitMapInfo;
BITMAPFILEHEADER* p_bmp_file_header=&bmp_file_header;

pbmfh=DibLoadImage(file_name.c_str());
::InvalidateRect(GetSafeHwnd(),NULL,TRUE);

pbmi=(BITMAPINFO*)(pbmfh+1);
pBits=(BYTE*)pbmfh+pbmfh->bfOffBits;

cxDib=pbmi->bmiHeader.biWidth;
cyDib=abs(pbmi->bmiHeader.biHeight);
}

void CNewbmpView::OnPaint()
{
CPaintDC dc(this);
if(pbmfh)
::SetDIBitsToDevice(dc,0,0,cxDib,cyDib,0,0,0,cyDib,pBits,pbmi,DIB_RGB_COLORS);
}

void CNewbmpView::OnDestroy()
{
CView::OnDestroy();
if(pbmfh)
free(pbmfh);
}

void CNewbmpView::OnMouseMove(UINT nFlags, CPoint point)
{
RECT rect;
GetClientRect(&rect);
ScreenToClient(&point);

if(point.x<=rect.right&&point.y<=rect.bottom)
{
HBRUSH hbrush2 = (HBRUSH)GetStockObject( NULL_BRUSH );
CClientDC dc(this);
SelectObject( dc, hbrush2 );
SetCursor(LoadCursor(NULL,IDC_CROSS));
}
CView::OnMouseMove(nFlags, point);
}

void CNewbmpView::OnLButtonDblClk(UINT nFlags, CPoint point)
{
CDistanceDlg dlg;
if(point.x<=cxDib&&point.y<=cyDib)
{

if(IDOK==dlg.DoModal())
{
if(dlg.m_str_distance!=_T(""))
{
CClientDC dc(this);
dc.SetTextColor(RGB(255,0,0));
dc.SetBkMode(TRANSPARENT);
CBrush brush;
brush.CreateSolidBrush(RGB(255,0,0));
dc.SelectObject(&brush);
HPEN hpen = CreatePen( PS_SOLID, 1, RGB(255,0,0) );
dc.SelectObject(hpen);
dc.Ellipse(point.x-2,point.y-2,point.x+2,point.y+2);
dc.SetPixel(point,RGB(255,0,0));
if(point.x+20>cxDib)
point.x-=20;
if(point.y+20>cyDib)
point.y-=20;
CString str=" ";

if(m_set_unit==1) str="cm";
if(m_set_unit==2) str="m";
if(m_set_unit==3) str="km";
dlg.m_str_distance=dlg.m_str_distance+str;
dc.TextOut(point.x+2,point.y+2,dlg.m_str_distance=dlg.m_str_distance+str);
}
}
}
CView::OnLButtonDblClk(nFlags, point);
}

void CNewbmpView::OnSave()
{
CDC dc;
dc.CreateDC("DISPLAY",NULL,NULL,NULL);
CBitmap bm;
int Width=cxDib;
int Height=cyDib;
bm.CreateCompatibleBitmap(&dc,Width,Height);
CDC tdc;
tdc.CreateCompatibleDC(&dc);
CBitmap *pOld=tdc.SelectObject(&bm);
tdc.BitBlt(0,0,Width,Height,&dc,0,57,SRCCOPY);
tdc.SelectObject(pOld);
BITMAP btm;
bm.GetBitmap(&btm);
DWORD size=btm.bmWidthBytes*btm.bmHeight;
LPSTR lpData=(LPSTR)::GlobalAlloc(GPTR,size);
BITMAPINFOHEADER bih;
bih.biBitCount=btm.bmBitsPixel;
bih.biClrImportant=0;
bih.biClrUsed=0;
bih.biCompression=0;
bih.biHeight=btm.bmHeight;
bih.biPlanes=1;
bih.biSize=sizeof(BITMAPINFOHEADER);
bih.biSizeImage=size;
bih.biWidth=btm.bmWidth;
bih.biXPelsPerMeter=0;
bih.biYPelsPerMeter=0;
GetDIBits(dc,bm,0,bih.biHeight,lpData,(BITMAPINFO*)&bih,DIB_RGB_COLORS);
CString file_name=m_filename.c_str();
file_name=file_name.Left(file_name.GetLength()-4);
file_name=file_name+"__MARKED.bmp";
BITMAPFILEHEADER bfh;
bfh.bfReserved1=bfh.bfReserved2=0;
bfh.bfType=((WORD)('M'<<8|'B'));
bfh.bfSize=54+size;
bfh.bfOffBits=54;
CFile bf;
if(bf.Open(file_name,CFile::modeCreate|CFile::modeWrite))
{
bf.WriteHuge(&bfh,sizeof(BITMAPFILEHEADER));
bf.WriteHuge(&bih,sizeof(BITMAPINFOHEADER));
bf.WriteHuge(lpData,size);
bf.Close();
}
::GlobalFree((HGLOBAL)lpData);
}

void CNewbmpView::OnSetMark()
{
Dlg_sel_unit dlg;

if(IDOK==dlg.DoModal())
{ UpdateData();

}
m_set_unit=dlg.m_sel_unit;
CString str;
str.Format("%d",m_set_unit);
MessageBox(str);
}

上面这段程序是view类里面,可以实现打开位图,保存位图功能。你按照这个思路找到那个点就OK了
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式