【问题标题】:JavaFX graphics "blurred" or anti-aliased? (No effects used)JavaFX 图形“模糊”或消除锯齿? (未使用效果)
【发布时间】:2012-03-19 23:59:14
【问题描述】:

我正在创建一些形状,但一切似乎都是模糊的,例如尽管没有应用任何效果,但已消除锯齿。

例如,在宽度为 1 像素的黑色背景上绘制的白线会呈现为灰色!将宽度更改为 2px 会导致白色,但定义不明确。

搜索时,形状上的方法setSmooth(false)返回,但调用它没有区别。

我应该在StageScene 上更改或禁用什么?

【问题讨论】:

    标签: java javafx


    【解决方案1】:

    请参阅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)。

    因此,当您的笔画宽度奇数时,您对干净线条的选择是:

    1. 使用 StrokeType.INSIDE 或 StrokeType.OUTSIDE 笔触样式。
    2. 将形状的坐标偏移 0.5 个像素,以便笔划在线条上对齐,而不是线条之间的裂缝。
    3. 只需使用下一个偶数作为笔划宽度,例如1 => 2、3 => 4 等

    至于为什么setSmooth(false)不起作用,我也不清楚,我的猜测是它所指的抗锯齿与笔画以像素之间的裂缝为中心时执行的抗锯齿样式无关,但我不会知道为什么会这样。

    【讨论】:

    • 我阅读了你粘贴的所有内容,(我现在有点羞愧因为谷歌搜索了很多,但从不记得查看 javafoc =),并测试了你推荐的所有解决方案! 1 - 在一条宽度为 1px 的线中,如果我设置为 INSIDE,线就会消失!使用 OUTSIDE,总共需要 2px 宽度。不能真正满足我的需求.. 2 - 这有完美的结果......我要这样做...... 3 - 这也有效,这是我之前找到的解决方案,但只适用于偶数.. . 无论如何,非常感谢您的回复,它完全解决了我的问题。教我一个道理:在提问之前,请阅读 javadoc!大声笑...
    • 别担心,这是一个合理的问题,而且这种行为,尤其是与 setSmooth 相关的行为,有点微妙而且不是特别直观。
    • 我编辑了我的评论,因为我按 Enter 尝试换行,它确认了只是第一部分...再次感谢!
    猜你喜欢
    • 2013-01-02
    • 2021-08-11
    • 2012-02-10
    • 2023-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-16
    • 1970-01-01
    相关资源
    最近更新 更多