Преобразовать пиксели в точки

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


person Todd Davis    schedule 26.09.2008    source источник


Ответы (12)


Есть 72 точки на дюйм; если достаточно принять 96 пикселей на дюйм, формула довольно проста:

точки = пикселей * 72/96

Есть способ получить настроенные пиксели на дюйм вашего дисплея в Windows, используя _ 1_. У Microsoft есть руководство под названием «Разработка приложений с поддержкой DPI», ищите раздел «Создание шрифтов с учетом DPI».

W3C определил измерение px в пикселях как точно 1/96 часть 1 дюйма независимо от фактического разрешения вашего дисплея, поэтому приведенная выше формула должна подходить для любой работы в Интернете.

person Mark Ransom    schedule 26.09.2008
comment
72 пункта на дюйм - НЕ спорная вещь, она одинакова для всех! - person Mitchel Sellers; 26.09.2008
comment
@David dpi зависит от дисплея, ppi - это типографская константа - person Corey Ross; 26.09.2008
comment
@David, эта статья просто объясняет, почему у мониторов есть переменный DPI. PPI остался прежним. Количество километров в миле не меняется в зависимости от вашего автомобиля. Предполагать, что 96 точек на дюйм, как правило, не очень хорошая идея, но если мы это сделаем, то данная формула верна. - person Quentin; 26.09.2008
comment
Обычно PPI - это сокращение для пикселей на дюйм, а не точек на дюйм. Может, отсюда и путаница? Баллы на дюйм всегда 72; спасибо за ссылку Xetius. - person Mark Ransom; 03.07.2009
comment
@ Кори Росс: Фактически, DPI будет зависеть от принтера, а PPI будет зависеть от монитора. Но все неправильно называют PPI ​​DPI ... - person Stefan Steiger; 04.08.2015

Попробуйте это, если ваш код находится в форме:

Graphics g = this.CreateGraphics();
points = pixels * 72 / g.DpiX;
g.Dispose();
person Hejazi    schedule 03.07.2009
comment
Стоит ли указывать, что DpiX для ширины, а DpiY должен использоваться для высоты? - person PandaWood; 10.08.2016

Предполагая, что 96 точек на дюйм - это огромная ошибка. Даже если предположение верно, есть возможность масштабировать шрифты. Таким образом, шрифт, установленный на 10 пунктов, на самом деле может отображаться так, как если бы он был 12,5 пунктов (125%).

person Joel Coehoorn    schedule 26.09.2008

Начиная с данного:

  • В дюйме 72 точки (вот что такое точка, 1/72 дюйма)
  • в системе, настроенной на 150 точек на дюйм, это 150 пикселей на дюйм.
  • 1 дюйм = 72 точки = 150 пикселей (для настройки 150 точек на дюйм)

Если вы хотите найти точки (pt) на основе пикселей (px):

 72 pt    x pt
------ = -----                  (1) for 150dpi system
150 px    y px

Перестановка:

x = (y/150) * 72                (2) for 150dpi system

so:

points = (pixels / 150) * 72    (3) for 150dpi system
person Ian Boyd    schedule 10.08.2009
comment
dpi в первом уравнении должно быть px - для сокращения терминов, так как у нас есть предположение (1) для системы 150dpi - person Jason S; 30.05.2015

WPF преобразует точки в пиксели с помощью System.Windows.FontSizeConverter. FontSizeConverter использует System.Windows.LengthConverter. LengthConverter использует коэффициент 1,333333333333333333 для преобразования точек (p) в пиксели (x): x = p * 1,3333333333333333

person Heind    schedule 02.09.2010
comment
Пожалуйста, также объясните, почему это значение используется ... По совпадению, это 96 точек на дюйм (разрешение окон по умолчанию для дисплеев) / 72 точек на дюйм (точек на дюйм, для которых определены точки). - person Has QUIT--Anony-Mousse; 11.12.2011

System.Drawing.Graphics имеет свойства DpiX и DpiY. DpiX - это количество пикселей на дюйм по горизонтали. DpiY - это количество пикселей на дюйм по вертикали. Используйте их для преобразования точек (72 точки на дюйм) в пиксели.

Пример: 14 точек по горизонтали = (14 * DpiX) / 72 пикселя.

person spotcatbug    schedule 26.09.2008

Наверняка весь этот вопрос должен быть таким:

«Как мне получить горизонтальный и вертикальный PPI (пикселей на дюйм) монитора?»

В дюйме 72 точки (по определению «точка» определяется как 1/72 дюйма, аналогично «пика» определяется как 1/72 дюйма). С помощью этих двух битов информации вы можете очень легко конвертировать из px в pt и обратно.

person JeeBee    schedule 26.09.2008
comment
Чтобы сделать это еще более сложным, я занимаюсь согласованием вещей в отчете Reporting Services (RDL), который конвертируется в PDF. В конце концов, кто, черт возьми, знает, что такое DPI? Я использую свое лучшее предположение. :) - person Todd Davis; 26.09.2008
comment
Вы имеете в виду, как мне получить разрешение монитора по горизонтали и вертикали? PPI - это константа, равная 72. Всегда был и всегда будет. - person Xetius; 03.07.2009
comment
Пикселей на дюйм, а не точек на дюйм (Pica). - person JeeBee; 03.07.2009
comment
Эм, ой, только не Пика! Это 1/6 дюйма. Количество баллов на дюйм является избыточным, термин - баллы. Точка - это 1/72 дюйма. - person JeeBee; 03.07.2009

На самом деле это должно быть

points = pixels * 96 / 72
person david    schedule 12.07.2010
comment
Это неверно, если вы предполагаете 96 точек на дюйм и 72 точек на дюйм (точек на дюйм). Это будут точки = пиксели * 72/96. - person Jason S; 30.05.2015

точки = (пикселей / 96) * 72 на стандартной машине XP / Vista / 7 (заводские настройки по умолчанию)

точки = (пикселей / 72) * 72 на стандартном Mac под управлением OSX (заводские настройки по умолчанию)

Windows по умолчанию работает с разрешением 96 точек на дюйм (дисплей). Mac по умолчанию работает с разрешением 72 точки на дюйм (дисплей).

72 пункта POSTSCRIPT = 1 дюйм 12 пунктов POSTSCRIPT = 1 POSTSCRIPT Pica 6 POSTSCRIPT Picas = 72 пункта = 1 дюйм

1 балл = 1⁄72 дюйма = 25,4⁄72 мм = 0,3527 мм

DPI = точек на дюйм PPI = пикселей на дюйм LPI = линий на дюйм

Дополнительная информация при использовании em в качестве меры

16px = 1em (по умолчанию для обычного текста) 8em = 16px * 8 пикселей / 16 = em

person Bubba Tbone    schedule 25.08.2011

Это работает:

int pixels = (int)((dp) * Resources.System.DisplayMetrics.Density + 0.5f);
person Michael Zhang    schedule 07.08.2016

Использование wxPython на Mac для получения правильного DPI следующим образом:

    from wx import ScreenDC
    from wx import Size

    size: Size = ScreenDC().GetPPI()
    print(f'x-DPI: {size.GetWidth()} y-DPI: {size.GetHeight()}')

Это дает:

x-DPI: 72 y-DPI: 72

Таким образом, формула:

точки: int = (pixelNumber * 72) // 72

person hasii    schedule 08.07.2020

Высота линий преобразована в точки и пиксели (моя собственная формула). Вот пример с ручным вводом 213,67 пункта в поле Высота строки:

213.67  Manual Entry    
  0.45  Add 0.45    
214.12  Subtotal    
213.75  Round to a multiple of 0.75 
213.00  Subtract 0.75 provides manual entry converted by Excel  
284.00  Divide by 0.75 gives the number of pixels of height

Здесь ручной ввод 213,67 точек дает 284 пикселей.
Здесь ручной ввод 213,68 точек дает 285 пикселей.

(Почему 0,45? Не знаю, но работает.)

person daniel    schedule 16.08.2010