【发布时间】:2012-03-19 23:59:14
【问题描述】:
我正在创建一些形状,但一切似乎都是模糊的,例如尽管没有应用任何效果,但已消除锯齿。
例如,在宽度为 1 像素的黑色背景上绘制的白线会呈现为灰色!将宽度更改为 2px 会导致白色,但定义不明确。
搜索时,形状上的方法setSmooth(false)返回,但调用它没有区别。
我应该在Stage 或Scene 上更改或禁用什么?
【问题讨论】:
我正在创建一些形状,但一切似乎都是模糊的,例如尽管没有应用任何效果,但已消除锯齿。
例如,在宽度为 1 像素的黑色背景上绘制的白线会呈现为灰色!将宽度更改为 2px 会导致白色,但定义不明确。
搜索时,形状上的方法setSmooth(false)返回,但调用它没有区别。
我应该在Stage 或Scene 上更改或禁用什么?
【问题讨论】:
请参阅Shape 文档:
大多数节点往往只应用整数转换,并且 它们通常也使用整数坐标定义。为了 在这种常见情况下,具有直线边缘的形状填充往往是 清晰,因为它们与落在像素之间的裂缝对齐 整数设备坐标,因此往往自然覆盖整个 像素。
另一方面,抚摸这些相同的形状通常会导致模糊 轮廓,因为默认的抚摸属性指定了 默认笔画宽度为 1.0 坐标,通常恰好映射到 1 设备像素,并且笔划应该跨越边界 形状,在边界的两侧下降一半。由于 许多常见形状的边框往往直接落在整数上 坐标和那些整数坐标通常精确映射到 整数设备位置,边界往往会导致 50% 的覆盖率 在边界两侧的像素行和列上 形状而不是 100% 覆盖一个或另一个。因此,填充可能 通常很清晰,但笔画通常很模糊。
避免这些模糊轮廓的两种常见解决方案是使用更宽的 完全覆盖更多像素的笔画 - 通常是笔画宽度 如果没有有效的比例变换,2.0 的 2.0 将实现这一点 - 或指定 StrokeType.INSIDE 或 StrokeType.OUTSIDE 笔划样式 - 将默认的单个单位笔划偏向 内部或外部的完整像素行或列之一 形状的边框。
另见Node的文档:
在设备像素级别,整数坐标映射到角落 像素和像素中心之间出现裂缝 整数像素位置之间的中点。因为所有坐标 值用浮点数指定,坐标可以 精确指向这些角(当浮点值有 精确的整数值)或像素上的任何位置。例如,一个 (0.5, 0.5) 的坐标将指向左上角的中心 舞台上的像素。类似地,一个位于 (0, 0) 的矩形,其尺寸为 10 x 10 将跨越左上角的左上角 舞台上的像素到舞台上第 10 个像素的右下角 第 10 条扫描线。里面最后一个像素的像素中心 矩形将位于坐标 (9.5, 9.5)。
因此,当您的笔画宽度奇数时,您对干净线条的选择是:
至于为什么setSmooth(false)不起作用,我也不清楚,我的猜测是它所指的抗锯齿与笔画以像素之间的裂缝为中心时执行的抗锯齿样式无关,但我不会知道为什么会这样。
【讨论】:
setSmooth 相关的行为,有点微妙而且不是特别直观。