VC画图:(1)在原有图像上画的图形保存不下来 (2)改变画笔的粗细时有“资源不可用”的错误提示
在原有图像处理的功能上,想再实现在一幅图像上随意绘制图形,并能把绘制的结果保存在图像上。
现在的基本思路是:
(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]);
int count = m_pointArray.GetSize();
for (int i=0; i < m_pointArray.GetSize(); i++)
{
dcImage.LineTo(m_pointArray[i]);
}
DeleteObject(pen);
//ReleaseDC(dcImage);
}
但是有两个问题:
(1)当我把m_pImageBufferDst里的信息写成bmp图像后,绘制的信息没有保存下来,还是我的原始图像。
(2)CPen pen(PS_SOLID, 1, &logBrush); 把其中的参数1改成10后,就会弹出“资源不可用”的提示。
[解决办法]
1、用GetDIBits获取图像数据。
2、第1参数用PS_GEOMETRIC。
[解决办法]
HBITMAP CreateBitmap(
int nWidth, // bitmap width, in pixels
int nHeight, // bitmap height, in pixels
UINT cPlanes, // number of color planes
UINT cBitsPerPel, // number of bits to identify color
CONST VOID *lpvBits // color data array
);
最后参数是const指针,表示指针指向的数据不会被改写。