基于MFC SDI的图像处理程序(带效果图) 收藏
本程序主要实现了位图的打开保存,JPG格式作为BMP格式,以及24位BMP转化到8位、4位、1位(黑白图)及灰度图。还有一些简单的算法如反色,采用高斯平滑进行图像模糊,以及提取轮廓的Canny算子(当然这些算法都是老师教我的,人家可是博士,我可没那么大本事,看懂用计算机语言表达出来也就不错了,呵呵,毕竟本人资历有限)。至于JPG的显示及转为BMP,要用到IPicture接口。
任何图像处理的书绝不会跳过位图,显示位图的方法我做过简单的总结:
方法一:DWORD fileSize;
CFile file;
file.Open(".//hr.bmp",CFile::modeRead);
fileSize=(DWORD)file.GetLength();
BYTE *buf=new BYTE[fileSize];
file.ReadHuge(buf,fileSize);
file.Close();
CWnd * hwnd = GetDlgItem(IDC_IPC);//IDC_IPC是图片资源的ID
HDC hdc= hwnd->GetDC()->m_hDC;
CRect rect;
hwnd->GetClientRect(&rect);
BITMAPFILEHEADER *pbmfh;
pbmfh =(BITMAPFILEHEADER *)buf;
BITMAPINFOHEADER *pbminfohead=(BITMAPINFOHEADER *) (pbmfh + 1);
int i=StretchDIBits(
hdc, // handle to DC
0, // x-coord of destination upper-left corner
0, // y-coord of destination upper-left corner
rect.Width(), // width of destination rectangle
rect.Height(), // height of destination rectangle
0, // x-coord of source upper-left corner
0, // y-coord of source upper-left corner
pbminfohead->biWidth, // width of source rectangle
pbminfohead->biHeight, // height of source rectangle
buf, // bitmap bits
(BITMAPINFO *) (pbminfohead),// bitmap data
DIB_RGB_COLORS, // usage options
SRCCOPY // raster operation code
);
/* SetDIBitsToDevice( hdc,0,0, rect.Width(), rect.Height(),
0,0,0,pbminfohead->biHeight,buf,(BITMAPINFO *) (pbminfohead),
DIB_RGB_COLORS);*/
delete buf;
方法二:
HBITMAP hbm = (HBITMAP)::LoadImage(NULL,(LPCTSTR)".//hr.bmp",IMAGE_BITMAP,0, 0, LR_LOADFROMFILE);
CBitmap m_Bitmap;
if (m_Bitmap.Attach(hbm))
{
BITMAP bm;
m_Bitmap.GetBitmap(&bm);
m_Bitmap.SetBitmapDimension(bm.bmWidth,bm.bmHeight);
}
CDC memDC;
CRect rt;
GetClientRect(&rt);
memDC.CreateCompatibleDC(pDC);
CBitmap* pImage = memDC.SelectObject(&pDoc->m_Bitmap);
CSize imageSize = pDoc->m_Bitmap.GetBitmapDimension();
//此时实在视图类的OnDraw函数调用的这个方法
//pDC->BitBlt(0,0,imageSize.cx,imageSize.cy,&memDC,0,0,SRCCOPY);
pDC->StretchBlt( 0, 0, rt.Width(), rt.Height(), &memDC,
0, 0, imageSize.cx, imageSize.cy, SRCCOPY );
memDC.SelectObject(pImage);
但是本程序中我用到了图像处理课本中的经典CDib类(MFC并不提供,需要自己编写),有了CDib类,关于位图的任何处理都是那么简单方便。
下面我用拷屏在画图里保存了一张24位位图,进行一个简单的转为4位位图的演示(看看4位位图的效果是不是差很多?)
如果哪位想要源码可以给我的QQ邮箱(250540696@qq.com)发邮件,希望与软件爱好者共同进步。
此致!
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/qifeng020717/archive/2009/09/28/4603755.aspx