Графика JavaFX «размытая» или сглаженная? (Эффекты не используются)

Я создаю некоторые формы для изучения, и все кажется размытым, например, сглаживание, и я не использую никаких эффектов (я пока не получаю эти уроки, смеется).

Например, я рисую белую линию на черном фоне с шириной в 1 пиксель, но она становится серой! Если я изменю ширину на 2 пикселя, он станет белым, но все еще не определен.

Когда я «гуглил», все, что я нашел, было методомsetSmooth(false) на фигуры, но это не имеет никакого значения. Есть ли что-то, что я должен изменить или отключить на сцене или сцене, которых я не знаю?

Любая помощь приветствуется. Спасибо за совет ...

Извините за мой английский все еще нуждаются в улучшении слишком LOL ... но это не мой естественный язык.

Ответы на вопрос(1)

Решение Вопроса

форма документация:

К большинству узлов обычно применяются только целочисленные переводы, и довольно часто они определяются с использованием целочисленных координат. В этом обычном случае заливки фигур с прямыми краями имеют тенденцию быть четкими, поскольку они выровнены с трещинами между пикселями, которые попадают в целочисленные координаты устройства и, таким образом, имеют тенденцию естественным образом покрывать целые пиксели.

С другой стороны, обводка тех же самых фигур может часто приводить к нечетким контурам, потому что атрибуты обводки по умолчанию определяют как то, что ширина обводки по умолчанию равна 1,0 координате, которая часто соответствует ровно одному пикселю устройства, так и то, что обводка должна охватывать границу формы падающая половина по обе стороны границы. Поскольку границы во многих распространенных формах имеют тенденцию приходиться непосредственно на целочисленные координаты, и эти целочисленные координаты часто отображаются точно на целочисленные местоположения устройства, границы имеют тенденцию приводить к 50% -ному покрытию по строкам и столбцам пикселей по обе стороны от границы формы а не 100% покрытие на одном или другом. Таким образом, заливки, как правило, могут быть четкими, но штрихи часто бывают нечеткими.

Двумя распространенными решениями, позволяющими избежать этих нечетких контуров, является использование более широких обводок, которые полностью покрывают больше пикселей - как правило, ширина обводки, равная 2,0, достигнет этого, если не выполняется преобразование масштаба, - или для указания обводки StrokeType.INSIDE или StrokeType.OUTSIDE. стили - которые смещают единичный штрих по умолчанию на одну из строк или столбцов полного пикселя непосредственно внутри или за пределами границы фигуры.

И см. Также документациюУзел:

На уровне пикселей устройства целочисленные координаты отображаются на углы, и трещины между пикселями и центрами пикселей появляются в средних точках между позициями целых пикселей. Поскольку все значения координат указаны с помощью чисел с плавающей запятой, координаты могут точно указывать на эти углы (когда значения с плавающей запятой имеют точные целочисленные значения) или на любое место в пикселе. Например, координата (0.5, 0.5) будет указывать на центр верхнего левого пикселя в рабочей области. Точно так же прямоугольник в (0, 0) с размерами 10 на 10 будет простираться от верхнего левого угла верхнего левого пикселя в рабочей области до нижнего правого угла 10-го пикселя на 10-й линии сканирования. Центр последнего пикселя внутри этого прямоугольника будет в координатах (9.5, 9.5).

Таким образом, ваши варианты для чистых линий, когда у вас есть нечетная ширина обводки:

Используйте стиль обводки StrokeType.INSIDE или StrokeType.OUTSIDE.Сместите координаты фигур на 0,5 пикселя, чтобы штрихи располагались на линиях, а не на трещинах между линиями.Просто используйте следующий четный номер в качестве ширины штриха, например 1 => 2, 3 => 4 и т. Д.

Относительно того, почемуsetSmooth(false) не работает, я точно не знаю, я предполагаю, что сглаживание, на которое оно ссылается, не зависит от стилей сглаживания, выполняемых, когда штрихи центрированы на трещинах между пикселями, но я не знаю, почему это так.

 Rodrigo Leitão20 мар. 2012 г., 21:37
Я прочитал все, что вы вставили (и мне уже немного стыдно за то, что я много гуглил, но никогда не забываю смотреть на javafoc =), и проверил все решения, которые вы предложили! 1 - Если в строке шириной 1 пиксель я установлю INSIDE, линия исчезнет! С ВНЕШНИЙ, это займет всего 2px ширины. Не совсем функционально для моих нужд ... 2 - это дало великолепные результаты ... Я иду с этим ... 3 - это тоже работает, это было решением, которое я нашел раньше, но просто работает для четных чисел ... В любом случае, действительно спасибо за ваш ответ, это решило мою проблему. И научи меня сезону: прежде чем спрашивать, прочитайте Javadoc! лол...
 Rodrigo Leitão20 мар. 2012 г., 21:42
Я редактирую свой комментарий, потому что я нажимаю Enter, чтобы попытаться разбить строку, и это подтвердило только первую часть ... Еще раз спасибо!
 jewelsea20 мар. 2012 г., 21:39
Не волнуйтесь, это разумный вопрос и поведение, особенно в отношенииsetSmoothСлегка тонко и не особо интуитивно понятно.

Ваш ответ на вопрос