在 CImage 对象上使用设备上下文绘制线条

Posted

技术标签:

【中文标题】在 CImage 对象上使用设备上下文绘制线条【英文标题】:Draw lines using Device Context over a CImage object 【发布时间】:2015-04-04 03:52:42 【问题描述】:

我正在构建一个 MFC c++ 应用程序,让用户在其中读取图像,在其上画线,然后保存。

所以我有一个名为“Image”的“CImage”对象,用户将图像加载到其中。

我有一个设备上下文对象,我可以在上面画线 设备上下文对象在运行时使用“OnLButtonDown”和“OnLButtonUp”事件处理程序。

然后我让用户使用“CImage.save”保存图像 .. 图像已保存,但设备上下文绘制的线条不存在,这是预期的 .. 但我确实希望它们出现在保存的图像中..

问题是如何让设备上下文对象影响我的 CImage 对象?

这是鼠标按下的事件处理程序

void CProFilterDlg::OnLButtonDown(UINT nFlags, CPoint point)

    curser =point;
    if (draw && Boundry.PtInRect(point) )
    
        CDialogEx::OnLButtonDown(nFlags, point);
    


当鼠标按钮向上时这个

void CProFilterDlg::OnLButtonUp(UINT nFlags, CPoint point)

    if (draw && Boundry.PtInRect(curser) && Boundry.PtInRect(point))
    
        CClientDC dc(this);
        dc.MoveTo(curser);
        dc.LineTo(point);
        CDialogEx::OnLButtonUp(nFlags, point);
    



这是我加载 Cimage 对象的地方

void CProFilterDlg::OnBnClickedBtnBrowse()

    CFileDialog Browse(true);
    if(Browse.DoModal() == IDOK)
    
         ImagePath = Browse.GetPathName();
    

        image.Load(ImagePath);

这是我保存 CImage 的地方

void CProFilterDlg::OnBnClickedSave()

    CFileDialog Save(true);
    if(Save.DoModal() == IDOK)
    
        ImagePath = Save.GetPathName();
    
    image.Save(ImagePath,Gdiplus::ImageFormatBMP);

【问题讨论】:

您是如何获得 DC 的?您没有显示任何相关代码。 我已编辑帖子以显示我的 DC 【参考方案1】:

从您显示的内容来看,您似乎使用了错误的 DC。您似乎将 DC 用于对话框(即 CCLientDC),而 不是 实际的 CImage。您应该从

构建 DC

CImage::GetDC ().

该 DC 将具有当前选定的位图。

【讨论】:

GetDC() 只为我提供了设备上下文的 HDC 句柄,我需要使用诸如 moveto() 和 lineto() 之类的功能,并且它仅适用于 CDC 我如何将这些功能与 GetDC 一起使用()? 您可以从 HDC 构建 DC。看看CDC的方法。您会发现 FromHandle 允许您创建 CDC。 我写道:HDC HDC =image.GetDC();疾控中心直流; pdc=dc.FromHandle(Hdc); dc.MoveTo(光标); dc.LineTo(点);但是发生了断言错误,并且在调试时我注意到未使用 Hdc “无法读取内存”:D 这很奇怪:D 您没有仔细阅读文档。 FromHandle 返回一个指向 CDC 的指针,不是一个实际的 CDC。您需要改用指针来更改调用方法的方式。【参考方案2】:

您在寻找CImage:BitBlt 吗?它用于将位图从源设备上下文复制到当前设备上下文。

【讨论】:

嗯,这将有助于我在图像的副本上绘图.. 我仍然需要将设备上下文与复制的位图放入 CImage 对象中,以便我可以使用 CImage.save

以上是关于在 CImage 对象上使用设备上下文绘制线条的主要内容,如果未能解决你的问题,请参考以下文章

初学canvas

设备上下文-CDC绘图细节

如何将窗口绘制到内存设备上下文?

iOS_绘制带删除线的Label

如何在 mfc 中更改 CImage 对象的背景颜色?

Quartz2D