- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
很多人都知道,HTML5 Canvas lineTo()
会在每个角处给您一条锯齿状的线。在这一点上,更可取的解决方案是实现 quadraticCurveTo()
,这是生成平滑绘图的一种非常好的方法。但是,我希望在 Canvas HTML5 上创建流畅而准确的绘图。二次曲线方法在平滑绘图方面效果很好,但它不会遍历所有样本点。换句话说,当我尝试使用二次曲线绘制快速曲线时,有时曲线似乎被应用程序“修正”了。一些线段没有按照我的绘图路径弯曲,而是从其原始路径弯曲以遵循二次曲线。
我的应用程序旨在用于在 HTML5 canvas 上进行专业绘图,因此绘图的流畅性和精确性非常重要。我不确定通过尝试将 HTML5 Canvas 与 photoshop 或任何其他画家应用程序(SAI、painterX 等)放在同一水平上,我是否在要求不可能
谢谢
最佳答案
你想要的是一个Cardinal spline当基数样条曲线穿过您绘制的实际点时。
注意:要获得专业的结果,您还需要对较短的阈值执行移动平均,而对较大的阈值使用基数样条,并使用拐点值在尖角处打断线条,这样您就不会平滑整条线条。我不会在这里讨论移动平均线或拐点(也不是锥度),因为它们超出了范围,但会展示一种使用基数样条的方法。
还有一个旁注 - 应用程序似乎修改线条的效果是不可避免的,因为平滑发生在后期。存在可以在您绘制时平滑的算法,但它们不会保留拐点值,并且在您绘制时线条似乎“摆动”。我想这是一个偏好问题。
这是一个演示以下内容的 fiddle :
ONLINE DEMO
首先是一些先决条件(我正在使用我的 easyCanvas 库在演示中设置环境,因为它节省了我很多工作,但这不是此解决方案工作的必要条件):
当你的数组中的点按 X/Y 排序时(即 [x1, y1, x2, y2, ... xn, yn]
),那么你可以使用这个函数来平滑它:
张力 值(ts
,默认值 0.5)使曲线平滑。数字越大,曲线越圆。您可以在正常区间 [0, 1] 之外进行 curl 。
段(nos
,或段数)是每个点之间的分辨率。在大多数情况下,您可能不需要高于 9-10。但在速度较慢的计算机上或绘制速度较快的地方,需要更高的值。
函数(优化):
/// cardinal spline by Ken Fyrstenberg, CC-attribute
function smoothCurve(pts, ts, nos) {
// use input value if provided, or use a default value
ts = (typeof ts === 'undefined') ? 0.5 : ts;
nos = (typeof nos === 'undefined') ? 16 : nos;
var _pts = [], res = [], // clone array
x, y, // our x,y coords
t1x, t2x, t1y, t2y, // tension vectors
c1, c2, c3, c4, // cardinal points
st, st2, st3, st23, st32, // steps
t, i, r = 0,
len = pts.length,
pt1, pt2, pt3, pt4;
_pts.push(pts[0]); //copy 1. point and insert at beginning
_pts.push(pts[1]);
_pts = _pts.concat(pts);
_pts.push(pts[len - 2]); //copy last point and append
_pts.push(pts[len - 1]);
for (i = 2; i < len; i+=2) {
pt1 = _pts[i];
pt2 = _pts[i+1];
pt3 = _pts[i+2];
pt4 = _pts[i+3];
t1x = (pt3 - _pts[i-2]) * ts;
t2x = (_pts[i+4] - pt1) * ts;
t1y = (pt4 - _pts[i-1]) * ts;
t2y = (_pts[i+5] - pt2) * ts;
for (t = 0; t <= nos; t++) {
// pre-calc steps
st = t / nos;
st2 = st * st;
st3 = st2 * st;
st23 = st3 * 2;
st32 = st2 * 3;
// calc cardinals
c1 = st23 - st32 + 1;
c2 = st32 - st23;
c3 = st3 - 2 * st2 + st;
c4 = st3 - st2;
res.push(c1 * pt1 + c2 * pt3 + c3 * t1x + c4 * t2x);
res.push(c1 * pt2 + c2 * pt4 + c3 * t1y + c4 * t2y);
} //for t
} //for i
return res;
}
然后在存储点后从 mouseup
事件简单地调用它:
stroke = smoothCurve(stroke, 0.5, 16);
strokes.push(stroke);
膝盖值的简短评论:
在此上下文中,拐点值是直线中各点(作为线段的一部分)之间的角度大于某个阈值(通常在 45 - 60 度之间)的位置。当发生拐点时,线条会被分成一条新线,以便仅使用由点之间的角度小于阈值的点组成的线(由于不使用拐点,您会在演示中看到小 curl )。
关于移动平均线的简短评论:
Moving average通常用于统计目的,但对于绘图应用程序也非常有用。当你有一个由许多点组成的集群,它们之间的距离很短时,样条曲线就不能很好地工作。所以这里可以使用MA来平滑点。
还有一些可以使用的减分算法,例如 Ramer/Douglas/Peucker一个,但它更多地用于存储目的以减少数据量。
关于html - 在 HTML5 Canvas 上模仿 photoshop/painter 平滑绘制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17877276/
为大型网站创建所有艺术作品通常涉及几十个 50+mb 的 Photoshop 文件。通常,给定的模块可能出现在多个文件中。 有没有办法从另一个文件引用经常使用的模块? 例如 -“site-sectio
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
我是 Photoshop 脚本的新手。 我想将图像图像(从我的硬盘)作为带有定位的新图层加载到事件文档中。如何才能做到这一点?有人可以分享代码吗? 谢谢 最佳答案 您可以打开 Photoshop 文件
在 photoshop 中,假设我有一些文本图层,其内容如下: Text layer 1: 1@@text01@@abc Text layer 2: 2@@text02@@cef Text lay
我在 Photoshop 中有 500 个图标图像,每个对象周围都有不同的空白区域。我想知道是否有任何方法可以通过 photoshop 运行一个 Action 来裁剪每个图像,以便它删除每个图标周围的
我在 Photoshop 中有 6 个组,每个组中包含多个图层。我希望打开/关闭每个组中的图层以创建图像的所有可能组合。 有人能指出我正确的方向吗? 我从来没有在 Photoshop 中编写过脚本,而
我想开始用 Photoshop 做一些脚本,我想知道是否有一个编辑器已经拥有 Photoshop 的对象或允许加载 Photoshop 的 DOM 以进行智能感知。 任何指针? 最佳答案 Adobe
几乎从一开始,Photoshop 文件就以 8BPS 开始。 (我已经在 2.5 版本中验证了这一点)它在某些时候一定具有某种意义。 我认为 8B 可能指的是位/ channel ,但保存为 16 或
如何在Photoshop中使用Javascript获取/设置当前工具? #target photoshop if (app.currentTool == BRUSH_TOOL) { app.c
几乎从一开始,Photoshop 文件就以 8BPS 开始。 (我已经验证回 2.5 版)它一定在某些时候有一些意义。 我认为 8B 可能指的是位/ channel ,但保存为 16 或 32 没有区
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 8 年前关闭。 Improve this
我有非常大的 1 位图像,我需要在 Photoshop 中写入文本数组。我可以在 javascript 中通过将图像转换为灰度然后为每个文本 block 创建一个新层来执行此操作,但我希望能够将文本直
如果我有一个具有以下设置的 photoshop 投影 Blend Mode - rgb(0,0,0) / Opacity - 25% / Angle - 135 degrees / Distance
我正在编写一个脚本,它将遍历图层,修剪它们并导出。到目前为止,我拥有完成此脚本所需的大部分元素。我唯一找不到的是如何显示/隐藏单个图层。我找到了显示/隐藏所有图层的功能,但对于单个图层没有任何功能。
如何在不裁剪的情况下查看矩形选取框选定区域的大小?在paint.net中这很容易,但我必须在photoshop cs 5中完成。在选择区域时,我应该能够看到所选区域的尺寸。我怎样才能做到这一点? 此外
在实现单选按钮时遇到问题。我知道 CS2 中的单选按钮可能有问题,但我不确定哪里出错了。我怀疑我的括号或逗号放错地方了;但看不到它。谢谢。 var dlg = "dialog {text:'Scrip
每种文件格式的技术规范/功能是什么? 一种类型是否比另一种更好地处理某些类型的图形? 最佳答案 XCF 支持保存每一层、当前选择、 channel 、透明度、路径和指南。但是,与 Adobe Ph
我希望 Photoshop 为给定的文件夹自动执行以下任务: 加载给定文件夹中的所有 PNG 文件。 将每个文件的模式转换为RGB 颜色 为每个文件添加一层 在同一文件夹中将文件另存为 PSD 有人告
我第一次编写一些 Photoshop 脚本,如果有一个类似 console.log 的函数来在 ExtendScript Toolkit App 的 Javascript 控制台中输出数组和对象值,那
我不知道如何将我为按钮制作的 Photoshop 形状导入 android,而不带背景。即使我将 photoshop 中的背景设置为透明并将其另存为 PNG,当我在 android 中将它用作我的按钮
我是一名优秀的程序员,十分优秀!