这个估计没有园友给你搞,这个没个一天半天的搞不定。你现在遇到了什么瓶颈?不好判断画线的速度吗?
怎么用图片代替pen画线
@y夜丶歌: 图片代替pen是什么意思?
@y夜丶歌: 就是记录鼠标左键点下事件和松开事件还有移动事件呀
@会长: pen不是只能画直线吗,上面那个图片的效果是我在CSDN上下的一个软件,但是没有源码,他好像就是用
这个图片来画线实现的效果
@会长: 不会啊,大佬。
@y夜丶歌: 鼠标点下后开始记录鼠标移动的轨迹,直到鼠标松开,停止记录。这样可以得到一组坐标,以为要判断划线速度,所有同时记录上每个点产生的时间就好了
@y夜丶歌: 曲线不就是多条直线连起来吗,然后每个直线的宽度设为不一样,不就行了
@会长: 他记录的是那个图片移动轨迹.
@y夜丶歌: 哦,那就比较高级了,可能效果更逼真,你有源码了呀?那仔细研究一下吧
@会长: 没有.
@y夜丶歌: 这方法不错,看起来更平滑一些,是不是移动的速度快了就把图片缩小一点,移动的慢了,就放大一点。这个主意不错
@会长: 对就是这样的,我在CSDN上面下的,可惜没有源码
@y夜丶歌: 那就好弄了呀,现在难点集中在两点:一是怎么组合很多图片,我觉得winform应该有这样的功能吧,根据图片的绝对位置来放置图片;二是怎么计算速度,其实也不是很难,就是把坐标点和坐标点产生的时间一一对应就能算出来速度
@会长: 我还是一个刚从学校毕业的萌新...
@y夜丶歌: 已经把难点分析出来了,你只要各个击破就好了
@y夜丶歌: 你可以循序渐进啊,先实现简单的写字,不分粗细,也不用图片,就用类库提供的画笔,然后你在想办法替换成图片,最后你再想办法计算划线的速度,根据速度对图片大小进行缩放
@会长: 公司项目,很急...
@y夜丶歌: 很急的话花点钱,让别人给你弄
@会长: 我在CSDN上面加了几个人,没实现...
@会长: 现在主要就是要实现手写毛笔字功能
@y夜丶歌: 下面有仁兄说了,有个DrawImage可以绘图,那难点只剩一个了,就是判断速度,好像没什么难的吧?判断速度你会不?距离除以时间
@会长: 好像是html canvans 里面的 我研究一下
@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();
}
}
}
@y夜丶歌: 我又想到一个主意,不过得等下周一再试了
感觉有点像卡尔曼滤波,就是根据之前所速度预测出一个宽度,再结合本次的速度计算下一个宽度,这样就实时了
@会长: 大佬,厉害
大佬还在吗,可以留个QQ或者微信吗
@会长: 大佬..
@y夜丶歌: 在下并无好办法想出来,周五想的那个不行
@会长: 好吧..
通过鼠标移动事件获取鼠标的位置,在那个位置用drawimage画图就行了
html?
公司项目,很急,刚刚毕业的萌新。
如果着急就能赚钱的话,哪有马化腾啥事啊,你们公司早就超越腾讯了。
这个东西就是毕业三五年的也不一定能做好,还很急呢。
说实话,现在交给我这个项目,我都不敢说三个月内做好。
碰到这种情况,解决方法很简单:
好吧.
你这实际效果根本就不是贴图能解决的。
大致结构需要包括:
路径(坐标点),
时间点(用于处理模糊字迹),
力度(就算Z坐标嘛,用于处理粗细);
然后两两之间应该还要记上斜率,整个用算法实现出来才科学。