怎样暂时保存显示出来的位图 我现在刚开始做一个图像处理的程序,想把对话框上的图像暂时保存起来,计算处理完之后再画到对话框上,另外如果我想把处理的中间结果作为bmp文件保存到硬盘上,应该怎么办? 我现在是把一个个像素读进动态数组,处理完在画出来,慢得不行。谁能帮帮我? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 怎么能够将一个个像素存到动态数组中去呢,楼主很强大啊!不知道楼主能不能把代码贴出来我的思路是这样的:CBitmap bitmap;CDC *pDC,memDC;pDC=GetDC();memDC.CreateCopatibleDC(pDC);bitmap.CreateCompatibleBitmap(pDC,width,height);memDC.SelectObject(&bitmap);CDC.BitBlt(0,0,width,height(),&memDC,0,0,SRCCOPY);将对话框DC上的位图复制到memDC中,这个时候bitmap就能够得到对话框上的位图 #include<atlimage.h >CDC *pDC = GetWindowDC(); CDC memDC; memDC.CreateCompatibleDC(pDC) ; CRect rt; GetWindowRect(&rt); CBitmap Bmp; Bmp.CreateCompatibleBitmap(pDC,rt.Width(), rt.Height()) ; CBitmap *pBmpPrev = (CBitmap*)memDC.SelectObject(&Bmp) ; memDC.BitBlt(0, 0, rt.Width(), rt.Height(), pDC, 0, 0, SRCCOPY); CImage image; image.Attach((HBITMAP)Bmp.m_hObject); image.Save(L"c:\\1.bmp"); 这个方法不好,慢得要命,尤其是SetPixel()下面是我的代码,功能是得到图像的水平投影,刚开始做,写的不好void CTestDlg::OnBtnLocate() { // TODO: Add your control notification handler code here COLORREF color; CClientDC dc(this); BeginWaitCursor(); HPos=new long[width/2]; VPos=new long[height/2];// for(int i=0;i<height;i++) //读取像素数据// { // vector<int> data;// for(int j=0;j<width;j++)// {// // BYTE num=color>>16;// data.push_back(num);// }// tempData.push_back(data);// } for(int i=0;i<width/2;i++) //得到水平方向上的投影 { HPos[i]=0; for(int j=0;j<height/2;j++) { color=GetPixel(dc.m_hDC,20+width/4+i,20+height/2+j); BYTE num=color; if (255==num) { HPos[i]+=1; } } } dc.MoveTo(20+width/4,720); dc.LineTo(20+width/4+width/2,720); dc.MoveTo(1000,20+height/2); dc.LineTo(1000,20+height); for(int x=0;x<width/2;x++) { for(int y=0;y<HPos[x];y++) { SetPixel(dc.m_hDC,20+width/4+x,720-y,RGB(255,0,0)); } } isLocated=true; EndWaitCursor(); ReleaseDC(&dc);} MSDN里是这么说的,但是我不知道怎么写,我想知道位图复制到bitmap里之后,怎么进行操作,比如灰度化,我想处理完之后再画到对话框上,这样速度比较快 我才看见,用CBitmap类的GetBitmapBits和SetBitmapBits方法可以读写复制的位图数据吗? 楼主看看opencv吧,很容易实现,几个函数即可完成 求MFC大神指点关于edit控件光标问题 求个思路? 创建文件夹的问题, 很简单的有关文件读写的问题 调用OCX出错! crebar使用无法显示 求助:如何让应用程序只启动一次? 请教 smtp 的问题 在VC里用控件怎么这么麻烦?怎么让MSCOMM通信控件在VC下活起来! 如何实现图片尺寸的编辑以及多副图片的移动、旋转、拼图功能? 怎么判断客户端已经连接了? 新手求助。。
我的思路是这样的:
CBitmap bitmap;
CDC *pDC,memDC;
pDC=GetDC();
memDC.CreateCopatibleDC(pDC);
bitmap.CreateCompatibleBitmap(pDC,width,height);
memDC.SelectObject(&bitmap);
CDC.BitBlt(0,0,width,height(),&memDC,0,0,SRCCOPY);
将对话框DC上的位图复制到memDC中,这个时候bitmap就能够得到对话框上的位图
CDC *pDC = GetWindowDC();
CDC memDC;
memDC.CreateCompatibleDC(pDC) ;
CRect rt;
GetWindowRect(&rt);
CBitmap Bmp;
Bmp.CreateCompatibleBitmap(pDC,rt.Width(), rt.Height()) ;
CBitmap *pBmpPrev = (CBitmap*)memDC.SelectObject(&Bmp) ;
memDC.BitBlt(0, 0, rt.Width(), rt.Height(), pDC, 0, 0, SRCCOPY);
CImage image;
image.Attach((HBITMAP)Bmp.m_hObject);
image.Save(L"c:\\1.bmp");
{
// TODO: Add your control notification handler code here
COLORREF color;
CClientDC dc(this);
BeginWaitCursor();
HPos=new long[width/2];
VPos=new long[height/2];// for(int i=0;i<height;i++) //读取像素数据
// {
// vector<int> data;
// for(int j=0;j<width;j++)
// {
//
// BYTE num=color>>16;
// data.push_back(num);
// }
// tempData.push_back(data);
// } for(int i=0;i<width/2;i++) //得到水平方向上的投影
{
HPos[i]=0;
for(int j=0;j<height/2;j++)
{
color=GetPixel(dc.m_hDC,20+width/4+i,20+height/2+j);
BYTE num=color;
if (255==num)
{
HPos[i]+=1;
}
}
} dc.MoveTo(20+width/4,720);
dc.LineTo(20+width/4+width/2,720); dc.MoveTo(1000,20+height/2);
dc.LineTo(1000,20+height); for(int x=0;x<width/2;x++)
{
for(int y=0;y<HPos[x];y++)
{
SetPixel(dc.m_hDC,20+width/4+x,720-y,RGB(255,0,0));
}
} isLocated=true;
EndWaitCursor();
ReleaseDC(&dc);
}
MSDN里是这么说的,但是我不知道怎么写,我想知道位图复制到bitmap里之后,怎么进行操作,比如灰度化,我想处理完之后再画到对话框上,这样速度比较快