首页 新闻 搜索 专区 学院

C# Winform或.NET如何自定义画笔

0
悬赏园豆:10 [待解决问题]

如何自定义画笔用这个图片画线,实现下图效果

y夜丶歌的主页 y夜丶歌 | 初学一级 | 园豆:153
提问于:2018-11-02 09:45
< >
分享
所有回答(5)
0

这个估计没有园友给你搞,这个没个一天半天的搞不定。你现在遇到了什么瓶颈?不好判断画线的速度吗?

会长 | 园豆:10302 (专家六级) | 2018-11-02 09:49

怎么用图片代替pen画线

支持(0) 反对(0) y夜丶歌 | 园豆:153 (初学一级) | 2018-11-02 09:50

@y夜丶歌: 图片代替pen是什么意思?

支持(0) 反对(0) 会长 | 园豆:10302 (专家六级) | 2018-11-02 09:51

@y夜丶歌: 就是记录鼠标左键点下事件和松开事件还有移动事件呀

支持(0) 反对(0) 会长 | 园豆:10302 (专家六级) | 2018-11-02 09:52

@会长: pen不是只能画直线吗,上面那个图片的效果是我在CSDN上下的一个软件,但是没有源码,他好像就是用

这个图片来画线实现的效果

支持(0) 反对(0) y夜丶歌 | 园豆:153 (初学一级) | 2018-11-02 09:52

@会长: 不会啊,大佬。

支持(0) 反对(0) y夜丶歌 | 园豆:153 (初学一级) | 2018-11-02 09:53

@y夜丶歌: 鼠标点下后开始记录鼠标移动的轨迹,直到鼠标松开,停止记录。这样可以得到一组坐标,以为要判断划线速度,所有同时记录上每个点产生的时间就好了

支持(0) 反对(0) 会长 | 园豆:10302 (专家六级) | 2018-11-02 09:53

@y夜丶歌: 曲线不就是多条直线连起来吗,然后每个直线的宽度设为不一样,不就行了

支持(0) 反对(0) 会长 | 园豆:10302 (专家六级) | 2018-11-02 09:54

@会长: 他记录的是那个图片移动轨迹.

支持(0) 反对(0) y夜丶歌 | 园豆:153 (初学一级) | 2018-11-02 09:55

@y夜丶歌: 哦,那就比较高级了,可能效果更逼真,你有源码了呀?那仔细研究一下吧

支持(0) 反对(0) 会长 | 园豆:10302 (专家六级) | 2018-11-02 09:57

@会长: 没有.

支持(0) 反对(0) y夜丶歌 | 园豆:153 (初学一级) | 2018-11-02 09:58

@y夜丶歌: 这方法不错,看起来更平滑一些,是不是移动的速度快了就把图片缩小一点,移动的慢了,就放大一点。这个主意不错

支持(0) 反对(0) 会长 | 园豆:10302 (专家六级) | 2018-11-02 09:59

@会长: 对就是这样的,我在CSDN上面下的,可惜没有源码

支持(0) 反对(0) y夜丶歌 | 园豆:153 (初学一级) | 2018-11-02 10:00

@y夜丶歌: 那就好弄了呀,现在难点集中在两点:一是怎么组合很多图片,我觉得winform应该有这样的功能吧,根据图片的绝对位置来放置图片;二是怎么计算速度,其实也不是很难,就是把坐标点和坐标点产生的时间一一对应就能算出来速度

支持(0) 反对(0) 会长 | 园豆:10302 (专家六级) | 2018-11-02 10:01

@会长: 我还是一个刚从学校毕业的萌新...

支持(0) 反对(0) y夜丶歌 | 园豆:153 (初学一级) | 2018-11-02 10:02

@y夜丶歌: 已经把难点分析出来了,你只要各个击破就好了

支持(0) 反对(0) 会长 | 园豆:10302 (专家六级) | 2018-11-02 10:07

@y夜丶歌: 你可以循序渐进啊,先实现简单的写字,不分粗细,也不用图片,就用类库提供的画笔,然后你在想办法替换成图片,最后你再想办法计算划线的速度,根据速度对图片大小进行缩放

支持(0) 反对(0) 会长 | 园豆:10302 (专家六级) | 2018-11-02 10:08

@会长: 公司项目,很急...

支持(0) 反对(0) y夜丶歌 | 园豆:153 (初学一级) | 2018-11-02 10:09

@y夜丶歌: 很急的话花点钱,让别人给你弄

支持(0) 反对(0) 会长 | 园豆:10302 (专家六级) | 2018-11-02 10:09

@会长: 我在CSDN上面加了几个人,没实现...

支持(0) 反对(0) y夜丶歌 | 园豆:153 (初学一级) | 2018-11-02 10:10

@会长: 现在主要就是要实现手写毛笔字功能

支持(0) 反对(0) y夜丶歌 | 园豆:153 (初学一级) | 2018-11-02 10:11

@y夜丶歌: 下面有仁兄说了,有个DrawImage可以绘图,那难点只剩一个了,就是判断速度,好像没什么难的吧?判断速度你会不?距离除以时间

支持(0) 反对(0) 会长 | 园豆:10302 (专家六级) | 2018-11-02 17:28

@会长: 好像是html canvans 里面的 我研究一下

支持(0) 反对(0) y夜丶歌 | 园豆:153 (初学一级) | 2018-11-02 17:29

@y夜丶歌: 我花了一个小时写了一个,但是很抱歉,粗细那个确实不好控制,我换了3个方案效果都不好,但是由于你的那个点是水滴状,往不同方向写还是有点粗细区分的,如果你还没弄出来,先凑合用吧:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.IO;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace FuckPen
{
    public partial class MainForm : Form
    {
        private Graphics _graphics;
        private bool _isPaintting;
        private Point _point;
        private Image _pen;

        private readonly float _maxPenWidth = 18;
        private readonly float _minPenWidth = 3;

        public MainForm()
        {
            InitializeComponent();
            string imagePath = Path.Combine(Application.StartupPath, "pen.png");
            _pen = new Bitmap(imagePath);
            
            this.pictureBox.MouseDown += MainForm_MouseDown;
            this.pictureBox.MouseUp += MainForm_MouseUp;
            this.pictureBox.MouseMove += MainForm_MouseMove;
        }

        private void MainForm_MouseMove(object sender, MouseEventArgs e)
        {
            if (_isPaintting)
            {
                if (!_point.IsEmpty)
                {
                    double distance = Math.Pow(Math.Pow(e.Location.X - _point.X, 2) + Math.Pow(e.Location.Y - _point.Y, 2), 0.5);
                    int width = (int)this.CalculatePenWidth(distance);
  
                    _pen = new Bitmap(_pen, new Size(width, width));

                    Point penLocation = new Point(e.Location.X , e.Location.Y );
                    _graphics.DrawImage(_pen, penLocation);
                }

                _point = e.Location;
            }
        }

        // 这个方法用来计算画笔的宽度,试了几个方法,效果都不理想
        private double CalculatePenWidth(double distance)
        {
            return _maxPenWidth;

            double maxDistance = 30;

            if (distance >= maxDistance) // 超过maxDistance按照maxDistance - 1算
            {
                distance = maxDistance - 1;
            }

            return (_maxPenWidth - _minPenWidth) * ((maxDistance - distance) / maxDistance);
        }

        private void MainForm_MouseUp(object sender, MouseEventArgs e)
        {
            _isPaintting = false;
            _point = Point.Empty;
        }

        private void MainForm_MouseDown(object sender, MouseEventArgs e)
        {
            _isPaintting = true;
            _graphics = this.pictureBox.CreateGraphics();
        }
    }
}
支持(0) 反对(0) 会长 | 园豆:10302 (专家六级) | 2018-11-02 19:27

@y夜丶歌: 我又想到一个主意,不过得等下周一再试了

支持(0) 反对(0) 会长 | 园豆:10302 (专家六级) | 2018-11-02 19:57

感觉有点像卡尔曼滤波,就是根据之前所速度预测出一个宽度,再结合本次的速度计算下一个宽度,这样就实时了

支持(0) 反对(0) 会长 | 园豆:10302 (专家六级) | 2018-11-02 20:14

@会长: 大佬,厉害

支持(0) 反对(0) y夜丶歌 | 园豆:153 (初学一级) | 2018-11-05 09:27

大佬还在吗,可以留个QQ或者微信吗

支持(0) 反对(0) y夜丶歌 | 园豆:153 (初学一级) | 2018-11-05 13:06

@会长: 大佬..

支持(0) 反对(0) y夜丶歌 | 园豆:153 (初学一级) | 2018-11-07 09:46

@y夜丶歌: 在下并无好办法想出来,周五想的那个不行

支持(0) 反对(0) 会长 | 园豆:10302 (专家六级) | 2018-11-07 10:44

@会长: 好吧..

支持(0) 反对(0) y夜丶歌 | 园豆:153 (初学一级) | 2018-11-07 10:44
0

通过鼠标移动事件获取鼠标的位置,在那个位置用drawimage画图就行了

jqw2009 | 园豆:2384 (老鸟四级) | 2018-11-02 16:17

html?

支持(0) 反对(0) y夜丶歌 | 园豆:153 (初学一级) | 2018-11-02 17:29
0

公司项目,很急,刚刚毕业的萌新。
如果着急就能赚钱的话,哪有马化腾啥事啊,你们公司早就超越腾讯了。
这个东西就是毕业三五年的也不一定能做好,还很急呢。
说实话,现在交给我这个项目,我都不敢说三个月内做好。

碰到这种情况,解决方法很简单:

  1. 降低需求,别想啥毛笔字,能有字就不错了。
  2. 换人,加人,花大价钱买。
  3. 加时间。慢慢磨到你变成大牛。
爱编程的大叔 | 园豆:30753 (高人七级) | 2018-11-02 16:54

好吧.

支持(0) 反对(0) y夜丶歌 | 园豆:153 (初学一级) | 2018-11-02 17:32
0

你这实际效果根本就不是贴图能解决的。
大致结构需要包括:
路径(坐标点),
时间点(用于处理模糊字迹),
力度(就算Z坐标嘛,用于处理粗细);
然后两两之间应该还要记上斜率,整个用算法实现出来才科学。

花飘水流兮 | 园豆:13072 (专家六级) | 2018-11-04 23:00
0

各种源代码 | 园豆:202 (菜鸟二级) | 2020-06-05 09:44
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册