关于GDI+的画笔问题,高手入进来看下啦,我是新手,不知怎么做才好?

来源:百度知道 编辑:UC知道 时间:2024/05/29 03:53:51
本人用以下代码做了一个笔,不过当我慢慢在窗口上画时,会出现不连续的现像,要是快画就不会出现这种现像,这是什么原因呢??这种不连续的现像,其实快慢都有,只不过是慢慢画会更加明显,就是类似锯齿啊,晕啊,不知道怎么改!555555
void CMyWnd::OnMouseMove(UINT nFlags, CPoint point)
{

if (MouseFlag==TRUE) //取得鼠标移动的当前坐标,画图
{
CClientDC dc(this);
Graphics graphics(dc.m_hDC);
Pen pen(Color(255,ColorX,ColorY,ColorZ),Width);

graphics.DrawLine(&pen, m_pt.x, m_pt.y, point.x, point.y);

m_pt=point;
}
}

如果画得慢,手的都对因素就比较明显,所以会有锯齿。

可以把取鼠标位置的间隔放长一点,就是某些mouse move消息不响应。

要么就通过算法去除噪点。
****图像细化后,很可能出现“毛刺”,同时也可能产生:
“桥”-----两结点间的线段
“环”-----在线上或线端出现,原图像有“小孔”或“粘连”引起
“孤点”-----独立的单个像素,原图像有“脏点”引起,若细化时不保留单点,就不会有“孤点”出现。
“孤短线”-----独立的短小线段,原图像局部不连续引起

****细化后的后续处理,应采取综合治理策略。
执行的一般顺序应是****
1.删“环”
2.删“毛刺”
3. 删“桥”
4. 删“孤点”或“孤短线”

****以下为删“毛刺”的大致过程****
int Xmin, Ymin, Xma, Ymax; //图像范围
int nbs; //邻像元数
int del; //是否删除过“毛刺”的标志 0/1
int i, j;
……
……
for(;;) //反复运行,直至del=0为止
{
del=0;
j=Ymin+1;
while(j<Ymax)
{
for (i=Xmin+1; i<Xmax; i++)
{
//当前像素为(i, j)
if ((i, j)为边缘像元)
//按细化法判断。细化后仍须这一步,因为在删“毛刺”过程,个别非边缘像元会转化为边缘像元(在复杂结点处)
{