Неправильный цвет обводки NSBezierPath

Я хочу нарисовать границу шириной 1 пиксель вокруг моего пользовательского NSView в DrawRect с помощью NSBezierPath:

BorderColor.Set();
var path = NSBezierPath.FromRect(theRect);
path.LineWidth = 1;
path.Stroke();

Теперь для BorderColor установлено значение NSColor.Gray, которое, как я вижу во время отладки, имеет цветовой код RGBA: (127,127,127,255)
Но граница шириной 1 пиксель, которая появляется на экране, получает этот цвет: (194,194,194,255)
Когда я устанавливаю path.LineWidth к 3, то я вижу 3 линии, середину с неправильным цветом (194..), 2 крыла с цветом (135,135,135,255) - который достаточно близок к желаемому (127..) цвету, чтобы быть в порядке.
Когда я вместо этого использую четыре прямоугольника шириной 1 пиксель для границы и Fill этих 4 прямоугольников, я также получаю цвет (135..), что снова нормально.

Я могу использовать это решение на основе прямоугольника, мне только интересно:
Есть ли способ добиться правильного цвета для границы шириной 1 пиксель с помощью NSBezierPath.Stroke?


person nvirth    schedule 16.09.2015    source источник


Ответы (1)


Предполагая, что вы правильно устанавливаете цвет обводки (мы не видим, как BorderColor настроен), возможно, вы измеряете значение цвета на экране, что, в частности, для тонкой линии, может быть анти -aliased, поэтому вы видите не исходный цвет, а результат алгоритма сглаживания.

Установите ширину на что-то большее, например 10, и измерьте цвет в середине «капли», чтобы убедиться, что вы не гонитесь за артефактами сглаживания.

person cacau    schedule 16.09.2015
comment
Спасибо, сглаживание вызвало проблему. Отключение его для рисования пути помогло: var context = NSGraphicsContext.CurrentContext; context.SaveGraphicsState(); context.ShouldAntialias = false; //...Drawing the path... context.RestoreGraphicsState(); - person nvirth; 16.09.2015
comment
На самом деле это может быть не то, что вам нужно — убедитесь, что вы выровняли свой рисунок по границам пикселей. Отключение сглаживания обычно не является фактическим решением и должно использоваться только в крайних случаях (хотя я не могу себе этого представить). - person cacau; 17.09.2015
comment
Еще раз спасибо, вы правы, сдвигая координаты линии на 0,5 пикселя (например, здесь) также может решить проблему. Теперь я также видел, что моя линия шириной 1 пиксель в действительности была шириной 2 пикселя до смещения координат (или отключения сглаживания). Я вижу это, когда рисую его в середине представления. Раньше я видел его только шириной 1 пиксель, потому что я нарисовал его на границах представления, поэтому линия 2. была обрезана. - person nvirth; 17.09.2015
comment
Приятно слышать, что это помогло! - person cacau; 17.09.2015