Как найти длину текста в пикселях

Let’s say I have the string “Hello”. This string is obviously five characters in length, but what is its length in pixels? Is there an easy way to determine this length in JavaScript? I have thought of a solution where an extra div would have to be displayed to the user, but this way seems hacky and complicated.

In the bigger picture, I am trying to determine how many spaces would be necessary to fill that length of the string. As you can probably tell from above, I think the best option would be to simply measure the length of the string and a single space character from the user’s perspective and calculate how many spaces should replace the text based off of that. This is going to be displayed in an HTML input text, by the way.

Thanks.

asked Feb 5, 2011 at 23:27

Gus's user avatar

3

You can determine the number of pixels the container of the string. You can do this by creating a hidden element in the DOM, setting the inner HTML to the string and then asking for the width.

answered Feb 5, 2011 at 23:34

rcravens's user avatar

rcravensrcravens

8,2902 gold badges32 silver badges25 bronze badges

3

I don’t think their is a good, easy way to do that, except computing the length of a container. The width depends on the font-size, the font, the letter-spacing, it will be different depending on the browser etc…

answered Feb 5, 2011 at 23:31

Robin's user avatar

RobinRobin

21.6k10 gold badges61 silver badges85 bronze badges

I’ve used this to determine the text length in pixels (jQuery syntax):

var txtLen = $(<selector>).text().length * $(<selector>).css('font-size').slice(0,-2);

where selector is whatever you use to target the specific element. Adjust where needed (if the font-size is not set in px).

For example:

var txtLen = $('table td').text().length * $('table td').css('font-size').slice(0,-2);

Real-life use of this was when I needed to determine whether to show the tooltip on a td with a fixed width – if td is wider than its contents, there is no need to show the tooltip.

Things stated in Robin’s answer still apply.

answered Jan 25, 2021 at 10:26

FiddlingAway's user avatar

FiddlingAwayFiddlingAway

1,5463 gold badges14 silver badges30 bronze badges

apt.ru

Timeweb – компания, которая размещает проекты клиентов в Интернете, регистрирует адреса сайтов и предоставляет аренду виртуальных и физических серверов. Разместите свой сайт в Сети – расскажите миру о себе!

Разместите свой сайт в Timeweb

Виртуальный хостинг

Быстрая загрузка вашего сайта, бесплатное доменное имя, SSL-сертификат и почта. Первоклассная круглосуточная поддержка.

Аренда VDS и VPS

Виртуальные серверы с почасовой оплатой. Меняйте конфигурацию сервера в любой момент и в пару кликов.

VDS

Выделенные серверы

Аренда физических серверов любых конфигураций — готовые сборки или под заказ.

Выделенные серверы

Если шрифт, например, “Times New Roman” и размер, например, 12 пт, известно, как длина строки, например, «Привет мир» будет рассчитываться в пикселях, может быть, только приблизительно?

Это нужно для ручного выравнивания текста, показанного в приложении Windows, вручную, поэтому мне нужно настроить числовые пространства, чтобы получить выравнивание.

2 ответа

Лучший ответ

Альтернатива – спросить у Windows следующее:

import ctypes

def GetTextDimensions(text, points, font):
    class SIZE(ctypes.Structure):
        _fields_ = [("cx", ctypes.c_long), ("cy", ctypes.c_long)]

    hdc = ctypes.windll.user32.GetDC(0)
    hfont = ctypes.windll.gdi32.CreateFontA(points, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, font)
    hfont_old = ctypes.windll.gdi32.SelectObject(hdc, hfont)

    size = SIZE(0, 0)
    ctypes.windll.gdi32.GetTextExtentPoint32A(hdc, text, len(text), ctypes.byref(size))

    ctypes.windll.gdi32.SelectObject(hdc, hfont_old)
    ctypes.windll.gdi32.DeleteObject(hfont)

    return (size.cx, size.cy)

print(GetTextDimensions("Hello world", 12, "Times New Roman"))
print(GetTextDimensions("Hello world", 12, "Arial"))

Это отобразит:

(47, 12)
(45, 12)


7

Martin Evans
3 Мар 2016 в 12:52

Основываясь на комментарии @Selcuk, я нашел ответ:

from PIL import ImageFont
font = ImageFont.truetype('times.ttf', 12)
size = font.getsize('Hello world')
print(size)

Который печатает (x, y) размер как:

(58, 11)


19

EquipDev
3 Мар 2016 в 12:28

0 / 0 / 0

Регистрация: 16.11.2009

Сообщений: 30

1

Как узнать ширину выводимого текста в пикселях

16.11.2009, 22:29. Показов 32529. Ответов 5


Студворк — интернет-сервис помощи студентам

Цель такая, мне нужно вывести в BitMap текст с использованием определенного шрифта и определенного размера шрифта. Можно ли как-нибудь узнать ширину и высоту которую займет текст после вывода с учетом шрифта и размера?



0



153 / 113 / 25

Регистрация: 23.06.2008

Сообщений: 320

17.11.2009, 07:36

2

Если текст будешь выводить средствами C#, то можно узнать.
Если ты хочешь вообще на любом рисунке найти надпись и узнать ее размеры, то тут намного сложнее. Тебе нужно копать в сторону OCR. А именно брать различные куски рисунка и преобразовывать их в текст, если получил текст, то вычисляй размер…



0



0 / 0 / 0

Регистрация: 16.11.2009

Сообщений: 30

17.11.2009, 10:20

 [ТС]

3

Цитата
Сообщение от d0s’A
Посмотреть сообщение

Если текст будешь выводить средствами C#, то можно узнать.
Если ты хочешь вообще на любом рисунке найти надпись и узнать ее размеры, то тут намного сложнее. Тебе нужно копать в сторону OCR. А именно брать различные куски рисунка и преобразовывать их в текст, если получил текст, то вычисляй размер…

Я текст буду выводить средствами C#



0



d0s’A

153 / 113 / 25

Регистрация: 23.06.2008

Сообщений: 320

17.11.2009, 12:16

4

Лучший ответ Сообщение было отмечено как решение

Решение

C#
1
2
3
4
5
6
7
8
9
10
//Твой рисунок
Bitmap newImage = new Bitmap(...);
//Твой шрифт
Font f = new Font(...);
//График для рисунка
Graphics g= Graphics.FromImage(newImage);
//Твой текст
string s = "Hello";
//Размер шрифта
Size size = g.MeasureString(s,f);

Вроде все



7



DonySuXX

16 / 16 / 1

Регистрация: 11.09.2011

Сообщений: 3

29.05.2012, 09:42

5

Лучший ответ Сообщение было отмечено как решение

Решение

Сейчас столкнулся с этой проблемой – и нашёл элегантное решение на MSDN.

C#
1
Size len = TextRenderer.MeasureText(Control.Text, Control.Font);

У Size есть и ширина и высота..
Поэтому в одну строчку можно узнать ширину текста.



16



0 / 0 / 0

Регистрация: 02.01.2023

Сообщений: 1

07.01.2023, 05:19

6

Size len = TextRenderer.MeasureText(Control.Text, Control.Font);
Не всегда работает корректно по сравнению с
Size size = g.MeasureString(s,f);
он немного уменьшает область, при различных размерах кегля и хвост строки выходит за его размеры



0



Определение размеров текста

Время на прочтение
2 мин

Количество просмотров 13K

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

После небольшого исследования выяснилось, что не всегда данный размер возможно получить обычными способами. Будь то методы jQuery, prototype или обычное обращение к параметрам DOM.

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

function inlineSize(el) {
  // дополнительные стили для клона, что бы мир не заметил чуда, и размеры отображались корректно
  var hiddenStyle = "left:-10000px;top:-10000px;height:auto;width:auto;position:absolute;";// создаем box элемент
  // для клонирования содержимого из нашего исходного inline блока
  var clone = document.createElement('div');// в обязательном порядке копируем стили с исходного элемента,
  // что бы размеры соответствовали исходнику.
  for (var i in el.style) {
    try {
      if ((el.style[i] != '') && (el.style[i].indexOf(":") > 0)) {
        clone.style[i] = el.style[i];
      }
    } catch (e) {}
  }// устанавливаем стили у клона, дабы он не мозолил глаз.
  // Учитываем, что IE не позволяет напрямую устанавливать значение аттрибута style
  document.all ? clone.style.setAttribute('cssText', hiddenStyle) : clone.setAttribute('style', hiddenStyle);// Переносим содержимое. Аккуратно.
  clone.innerHTML = el.innerHTML// Добавляем клон в корневой документ.
  // Так, на всякий пожарный в parent, а то вдруг элемент внутри iframe?
  parent.document.body.appendChild(clone);// Забиваем заветное.
  var rect = {width:clone.clientWidth,height:clone.clientHeight};// ...и тут же удаляем
  parent.document.body.removeChild(clone);// Вот собственно говоря и все.
  return rect;
}
* This source code was highlighted with Source Code Highlighter.

Тестировалось на FF2, FF3, IE7.

На данный момент существуют плагины для jQuery, extension для prototype и методы в ExtJS, которые позволяют выполнять данную функцию и может быть даже в более лучшем виде. Однако мне хотелось отразить на чистом языке, как это все происходит. Надеюсь, этот код сэкономит немного времени вашей драгоценной жизни 😉

Добавить комментарий