在原有图像处理的功能上,想再实现在一幅图像上随意绘制图形,并能把绘制的结果保存在图像上。
现在的基本思路是:
(1)打开一幅图像后,点击菜单项“绘图”后,即可在该图像上用鼠标随意绘线,把鼠标画线的坐标点存到 CArray<CPoint,CPoing>数组中。
(2)点击菜单“图像叠加”后,在该响应函数内,生成兼容DC,并把含有源图像信息的内存位图选入DC,根据之前的保存结果,用同样的画笔再重绘一次。那这个源图像上的颜色信息应该就会发生改变了吧。
程序如下:
void CImagePView::OnLButtonDown(UINT nFlags, CPoint point)
{
if (m_bStartDraw) //标志着可以开始绘图
{
m_PtOld = m_PtCurrent = point;
if(m_PtOld.y >= m_nHeightDst | m_PtOld.x >= m_nWidthDst)
{
return;
}
m_btnDown = TRUE; //鼠标左键被按下
}
}
void CImagePView::OnMouseMove(UINT nFlags, CPoint point)
{
if (m_bStartDraw && m_btnDown)
{
CDC* m_pDc = GetDC();
m_PtCurrent = point;
if(m_PtCurrent.y >= m_nHeightDst | m_PtCurrent.x >= m_nWidthDst)
return;
//创建铅笔对象
LOGBRUSH logBrush;
logBrush.lbStyle = BS_SOLID;
logBrush.lbColor = RGB(0, 0, 0);
CPen pen(PS_SOLID, 1, &logBrush);
CPen* oldPen = m_pDc->SelectObject(&pen); // 选中新的笔对象
m_pDc->MoveTo(m_PtOld);
m_pDc->LineTo(m_PtCurrent);
m_pDc->SelectObject(oldPen);
m_pointArray.Add(m_PtOld); // 添加到图形容器中
DeleteObject(pen);
ReleaseDC(m_pDc);
m_PtOld = m_PtCurrent;
}
}
void CImagePView::OnLButtonUp(UINT nFlags, CPoint point)
{
if (m_bStartDraw && m_btnDown)
{
m_btnDown = FALSE;
m_PtCurrent = point;
if(m_PtCurrent.y >= m_nHeightDst | m_PtCurrent.x >= m_nWidthDst)
return;
}
}
void CImagePView::OnImageAdd()
{
// TODO: 在此添加命令处理程序代码
m_bStartDraw = FALSE;
HBITMAP hBitmap = CreateBitmap(m_nWidthDst, m_nHeightDst, 1, 32, m_pImageBufferDst);
m_bitmap.Detach();
m_bitmap.Attach(hBitmap);
CClientDC dc(this);
CDC dcImage;
if (!dcImage.CreateCompatibleDC(&dc))
{
return;
}
CBitmap* pOldBitmap = dcImage.SelectObject(&m_bitmap);
//创建铅笔对象
LOGBRUSH logBrush;
logBrush.lbStyle = BS_SOLID;
logBrush.lbColor = RGB(0, 0, 0);
CPen pen(PS_SOLID, 1, &logBrush);
CPen* oldPen = dcImage.SelectObject(&pen); // 选中新的笔对象
dcImage.MoveTo(m_pointArray[0]);