VC++下如何加载一张位图并且得到该位图每个像素点的值?

Darryldd 2010-01-10 01:35:05
VC++下用MFC如何加载或者说读取一张位图,并且得到该位图每个像素点的值?
MFC菜鸟一名,技术相当弱(使劲往非常弱的程度想。。。可能您认为某些应该是基本的东西我也不会。。。)网上看了很多资料,但是由于自己基础十分浅薄,经验匮乏,实在是如堕云里雾里,不甚理解。
求高手不吝赐教,指点迷津。最好能有具体的例子示范如何调用某函数之类。拜谢!
...全文
588 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
sjdev 2010-01-11
  • 打赏
  • 举报
回复
lambochan 2010-01-11
  • 打赏
  • 举报
回复
不是打击你,写了代码给你你也不懂,解释给你听你也不会明白..
所以象2楼所言,先去耐心地看看位图格式,弄懂了后其它自然就迎刃而解了。
Sandrer 2010-01-11
  • 打赏
  • 举报
回复
奉劝楼主还是学学位图的文件结构,学会了之后直接用读文件的方法,操作文件指针直接读到数组中就可以了,也就几十毫秒的事情!
如果用 GetPixel,小一点的图片还不怎么觉得慢,换个大点的图片估计你吃完饭它还没读完

之前我自己尝试过用 GetPixel 来旋转图片,一张800 * 480 的图片光读像素值就用了20秒左右
littleqiongqiong 2010-01-11
  • 打赏
  • 举报
回复
用CImage吧,很方便。
/////////////////这段读取图片的每个像素/////////////////////////////////
CImage img;
img.Load(L"c:\\0.bmp");
for(int i = 0; i < img.GetWidth(); i++)
{
for(int j = 0; j < img.GetHeight(); j++)
{
COLORREF col = img.GetPixel(i, j);
int r = GetRValue(col);
........
}
}
/////////////////////////在OnPaint里写这段加载一个图片////////////////////////
CBitmap bmp;
bmp.Attach((HBITMAP)img);
CPaintDC dc(this);
CDC dcMem;
dcMem.CreateCompatibleDC(&dc);
HGDIOBJ old = dcMem.SelectObject(bmp);
dc.BitBlt(0,0, 100,100,&dcMem,0,0,SRCCOPY);
dcMem.SelectObject(old);
dcMem.DeleteDC();
dyb170878312 2010-01-11
  • 打赏
  • 举报
回复
都是高手,学习!,我估计是比楼主还菜的类型
wltg2001 2010-01-10
  • 打赏
  • 举报
回复
VC++下用MFC如何加载或者说读取一张位图,并且得到该位图每个像素点的值?
===============
加载位图一般用LoadImage就行了,文件名的获取一般用CFileDialog 对话框,显示用BitBlt,当然事先要建立CDC之类的,这个上面不少人说了。每个像素点一般用GetDIBits,可以将一个位图中的数据放到一个数组中去。如果是取某一个位置的色值可以用GetPixel
schlafenhamster 2010-01-10
  • 打赏
  • 举报
回复
// 自己画
void CDrawbmpView::OnDraw(CDC* pDC)
{
CDrawbmpDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here
int hei=508;
int wid=648;
int count,ofs;
BYTE *ScreenPtr0=0;
BYTE *ScreenPtr=0;
COLORREF color_table[16]={// 0x00bbggrr
0x000000, //0
0x000080, //1
0x008000, //2
0x008080, //3
0x800000, //4
0x800080, //5
0x808000, //6
0x808080, //7
0xC0C0C0, //8
0x0000FF, //9
0x00FF00, //10
0x00FFFF, //11
0xFF0000, //12
0xFF00FF, //13
0xFFFF00, //14
0xFFFFFF };//15
// open 该文件只有bmp的数据,无BMPINFOHEADER 和调色板!
CFile if_hnd;
if(!if_hnd.Open("tmp.bmp",CFile::modeRead|CFile::shareExclusive))
{
AfxMessageBox("Cann't open image file!");
return;
}
// get mem
unsigned fsize;
fsize =if_hnd.GetLength();//
ScreenPtr0=(BYTE *)new char[fsize]; //
// read all in
if_hnd.Read(ScreenPtr0,fsize);//
// image data are in buffer
if(if_hnd) if_hnd.Close();
int count1=0;
//
for (count1=0; count1<hei; count1++)
{// draw from bottom
ScreenPtr=ScreenPtr0+fsize-(count1+1)*wid/2;//
for (count=0;count<wid/2; count++)
{
ofs=(ScreenPtr[count]>>4) & 0x0F;
SetPixel(pDC->m_hDC,2*count,count1,color_table[ofs]);
//
ofs=ScreenPtr[count] & 0x0F;
SetPixel(pDC->m_hDC,2*count+1,count1,color_table[ofs]); }
}
if(ScreenPtr0) delete []ScreenPtr0;
}
cbib_cat 2010-01-10
  • 打赏
  • 举报
回复
用GetPixel() 函数
Sandrer 2010-01-10
  • 打赏
  • 举报
回复
网上搜索《位图文件结构》,慢慢看你就懂了!
yueyue73 2010-01-10
  • 打赏
  • 举报
回复
void CPaintView::OnFileOpen()
{
// TODO: Add your command handler code here
CFileDialog dlg(TRUE, "bmp", ".bmp", OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"位图文件(*.bmp)|*.bmp||");
if (dlg.DoModal() == IDOK)
{
Bmpname.Format("%s", dlg.GetPathName());
OpenBmp(Bmpname);
}
}

void CPaintView::OpenBmp(CString Bmpname)
{
if(State == 0)
{
HBITMAP hBitmap = (HBITMAP) LoadImage(NULL, _T(Bmpname), IMAGE_BITMAP,
0, 0, LR_CREATEDIBSECTION | LR_DEFAULTSIZE | LR_LOADFROMFILE);
m_bitmap.Attach(hBitmap);
State = 1;
}
}

void CPaintView::OnDraw(CDC* pDC)
{
CPaintDoc* pDoc = GetDocument();
ASSERT_VALID(pDoc);
// TODO: add draw code for native data here

if (State == 1)
{
CDC dc;
if (!dc.CreateCompatibleDC(pDC))
return;
CBitmap *pOldBitmap = NULL;
m_bitmap.GetBitmap(&bm);
dc.SelectObject(m_bitmap);

pDC->BitBlt(0, 0, bm.bmWidth, bm.bmHeight, &dc, 0, 0, SRCCOPY);
dc.SelectObject(pOldBitmap);
}
}

19,468

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 图形处理/算法
社区管理员
  • 图形处理/算法社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧