Поиск значения текстового «пробела» в пикселях

#c# #c #text #typography

#c# #c #текст #типография

Вопрос:

При работе со шрифтами есть ли способ выяснить, каким должен быть пробел между двумя символами, если бы это было «1 2»?

Если это известно в C или C #, я не возражаю. Если оно на C , я его переделаю, если на C #, я сохраню его в файл и загружу на C . Я попытался взглянуть на текстовую структуру, но ее там не было.

Комментарии:

1. Я не уверен, о чем вы спрашиваете, вы спрашиваете, как вычислить, сколько пикселей занимает пробел, на основе шрифта, которым он напечатан?

2. Вы имеете в виду графическое расстояние между символами или пустой символ, называемый пробелом?

Ответ №1:

Графика.MeasureCharacterRanges дает довольно хорошие результаты при измерении отдельных символов (четных пробелов) путем добавления символа нулевой ширины u200D до и после. Однако он игнорирует все элементы кернинга, я думаю, из-за соединителей нулевой ширины.

Вам нужна куча дополнительных параметров, но для меня a new StringFormat(StringFormat.GenericTypographic) и Rectangle.Empty вполне подошли.

Он возвращает массив хороших границ с плавающей запятой для каждого символа в строке.

Ответ №2:

Если вам нужны показатели того, как будет отображаться текст, вам необходимо предоставить текст. Вам нужно будет указать символ пробела ascii. Современные системы, использующие кернинг для регулировки интервалов и придания тексту более привлекательного вида.

Ответ №3:

Можете ли вы использовать графику.MeasureString() и передача шрифта и " " строки с пробелом?

Комментарии:

1. Этот метод очень неточен для отдельных символов, и я думаю, что он возвращает ноль для одного пробела.

Ответ №4:

Вот пример на C # с использованием обработчика событий Paint в форме:

 private void Form1_Paint(object sender, System.Windows.Forms.PaintEventArgs e)
{
    float widthWithSpace = e.Graphics.MeasureString("1 2", new Font("Arial", 12)).Width;
    float widthWithoutSpace = e.Graphics.MeasureString("12", new Font("Arial", 12)).Width;
    float spaceWidthInPixels = widthWithSpace - widthWithoutSpace ;
}