基于MFC SDI的图像处理程序(带效果图)

 基于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

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值