图像处理---黑白化

简介:
核心对象:
     CImage m_imageFile; 
绘制图片:
void CFigureView::OnDraw(CDC* pDC)
{
    CFigureDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;

    // TODO: 在此处为本机数据添加绘制代码
    CBrush BackBrush;
    BackBrush.CreateSolidBrush(RGB(255,255,255));
    CBrush* pOldBrush = pDC->SelectObject(&BackBrush);
    CRect rect;
    this->GetClientRect(&rect);
    pDC->Rectangle(rect);//CRect(-1,-1,3000,3000));
    pDC->SelectObject(pOldBrush);
    if (!m_imageFile.IsNull())
    {//图片不为空
        m_imageFile.StretchBlt(pDC->m_hDC,CRect(&m_rectShow),SRCCOPY);//复制图片到显示设备
    }
}

打开图片:
void CFigureView::OnFileOpen()
{//打开图片文件
    // TODO: 在此添加命令处理程序代码
    CString strFilter;
    CString strImageFileName;
    CSimpleArray<GUID> aguidFileTypes;
    HRESULT hResult;
    hResult = m_imageFile.GetExporterFilterString(strFilter,aguidFileTypes);
    if(FAILED(hResult))
    {
        MessageBox("装入文件类型过滤器操作失败","消息提示",MB_OK);
        return;
    }
    strFilter = "All File(*.*)|*.*|"+strFilter;
    CFileDialog dlg(TRUE,NULL,NULL,OFN_HIDEREADONLY,strFilter);
    hResult = (int)dlg.DoModal();
    if(hResult != IDOK) 
        return;
    strImageFileName.Format(dlg.GetFileName());
    m_imageFile.Destroy();
    hResult = m_imageFile.Load(strImageFileName);
    if(FAILED(hResult))
    {
        MessageBox("装入图像文件操作失败","消息提示",MB_OK);
        return;
    }
    m_rectShow = CRect(0,0,m_imageFile.GetWidth(),m_imageFile.GetHeight());//显示区域
    SetScrollSizes(MM_TEXT,CSize(m_rectShow.Width(),m_rectShow.Height()));
    CWnd* pWnd=AfxGetMainWnd();
    pWnd->SetWindowTextA("当前正在打开的文件名称为:"+strImageFileName);
    Invalidate();//刷新
}

进行黑白化处理:
 void CFigureView::MakeBlackWhiteImage(CImage& pImage, int iType)
{//黑白化
    CWaitCursor WaitCursor;
    int Height = pImage.GetHeight();//高度
    int Width = pImage.GetWidth();//宽度
    if(!pImage.IsIndexed())//Indicates that a bitmap's colors are mapped to an indexed palette
    {//没有使用调色板
        for(int x=0; x<Width; x++)
        {
            for(int y=0; y<Height;y++)
            {
                COLORREF pixel=pImage.GetPixel(x,y);//Retrieves the color of the pixel at the location specified by x and y.
                byte r,g,b,Result;
                r = GetRValue(pixel);
                g = GetGValue(pixel);
                b = GetBValue(pixel);
                switch(iType)
                {
                case 0:
                    Result = ((r+g+b)/3);
                    break;
                case 1:
                    Result = max(max(r,g),b);
                    break;
                case 2:
                    Result = (2.7*r+0.2*g+0.1*b);
                    break;
                }
                pImage.SetPixel(x,y,RGB(Result,Result,Result));
            }
        }
    }
    else
    {//使用调色板
        int MaxColors = pImage.GetMaxColorTableEntries();//Retrieves the maximum number of entries in the color table
        RGBQUAD* ColorTable = new RGBQUAD[MaxColors];
        //Retrieves red, green, blue (RGB) color values from a range of entries in the palette of the DIB section
        pImage.GetColorTable(0,MaxColors,ColorTable);
        for(int i=0;i<MaxColors;i++)
        {
            byte r,g,b,Result;
            r = ColorTable[i].rgbRed;
            g = ColorTable[i].rgbGreen;
            b = ColorTable[i].rgbBlue;
            switch(iType)
            {
            case 0:
                Result = ((r+g+b)/3);
                break;
            case 1:
                Result = max(max(r,g),b);
                break;
            case 2:
                Result = (2.7*r+0.2*g+0.1*b);
                break;
            }
            ColorTable[i].rgbRed = Result;
            ColorTable[i].rgbGreen = Result;
            ColorTable[i].rgbBlue = Result;
        }
        pImage.SetColorTable(0,MaxColors,ColorTable);
        delete ColorTable;
    }
}

void CFigureView::OnPsBw()
{//图片黑白化
    // TODO: 在此添加命令处理程序代码
    MakeBlackWhiteImage(m_imageFile,0);

    CFigureDoc* pDoc = GetDocument();
    ASSERT_VALID(pDoc);
    if (!pDoc)
        return;
    pDoc->SetModifiedFlag(TRUE);//设置修改标志
    Invalidate();
}

处理效果:

2008030803.jpg

本文转自Phinecos(洞庭散人)博客园博客,原文链接:http://www.cnblogs.com/phinecos/archive/2008/03/08/1096896.html,如需转载请自行联系原作者
目录
相关文章
|
10月前
|
机器学习/深度学习 存储 编解码
|
10月前
|
机器学习/深度学习 存储 编解码
|
10月前
|
机器学习/深度学习 存储 编解码
底层视觉与黑白图像上色
底层视觉(即视觉增强)是计算机视觉中的一个分支,它专注于提高图像整体的观看体验。如果 “中高层视觉” 关注的是如何让计算机理解图像中的内容,那么底层视觉则致力于解决图像的清晰度、色彩、时序等各类画质问题。这些问题的出现与拍摄环境、设备等因素有关,而视觉增强技术则旨在修复这些问题,提供更好的视觉观看体验。
|
编解码 算法 计算机视觉
小波分析法图像处理----图像增强
小波分析法图像处理----图像增强
660 0
小波分析法图像处理----图像增强
|
算法 C#
图像滤镜艺术---图像光照效果滤镜
原文:图像滤镜艺术---图像光照效果滤镜     图像光照滤镜     图像光照提滤镜主要是模拟阳光照射下的图像效果,通常使用在暗光环境下拍摄的照片中,或者是没有太阳的日景照片中。
1088 0
|
算法
图像滤镜艺术---PS图像转手绘特效实现方案
原文:图像滤镜艺术---PS图像转手绘特效实现方案 手绘效果实现方案 本文介绍一种PS手绘效果的实现方案,PS步骤来自网络,本文介绍代码实现过程。
1228 0
|
算法 C# 计算机视觉
Win8Metro(C#)数字图像处理--2.7图像伪彩色
原文:Win8Metro(C#)数字图像处理--2.7图像伪彩色  2.7图像伪彩色函数 [函数名称] 图像伪彩色函数PseudoColorProcess(WriteableBitmap src) [算法说明]   伪彩色是为改善视觉效果,利用计算机图像增强技术对图像的灰度赋予的不同假色彩,即,将一张灰度图转化为彩色图。
1079 0
|
算法 C#
图像滤镜艺术---霓虹、浮雕、木刻滤镜
原文:图像滤镜艺术---霓虹、浮雕、木刻滤镜  图像特效往往可以将普通的照片呈现出一种令人耳目一新的效果,特效的种类繁多,比如各种流行的 滤镜特效等等,今天,我们介绍几种最简单的滤镜:霓虹效果,浮雕效果和木刻效果。
1692 0
|
C#
图像滤镜艺术---球面(Spherize)滤镜
原文:图像滤镜艺术---球面(Spherize)滤镜 球面(Spherize)滤镜 球面滤镜是通过极坐标变换实现图像的球面特效。 代码如下:         //         ///         /// Pinch Filter         ///        /// Source image.
985 0