Графика JavaFX "размытая" или сглаженная? (Эффекты не используются) - PullRequest
5 голосов
/ 20 марта 2012

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

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

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

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

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

1 Ответ

3 голосов
/ 21 марта 2012

См. Документацию Shape :

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

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

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

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

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

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...