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

126

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

Тодд Дэвис
источник

Ответы:

199

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

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

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

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

Марк Рэнсом
источник
26
72 пункта на дюйм - это НЕ спорная вещь, она одинакова для всех!
Митчел Селлерс,
11
@David dpi зависит от дисплея, ppi - это типографская константа
Кори Росс,
3
@David, эта статья просто объясняет, почему у мониторов есть переменный DPI. PPI остался прежним. Количество километров в миле не меняется в зависимости от вашего автомобиля. Предполагать, что 96 точек на дюйм, как правило, не очень хорошая идея, но если мы это сделаем, то данная формула верна.
Квентин,
13
Обычно PPI - это сокращение для пикселей на дюйм, а не точек на дюйм. Может, отсюда и путаница? Баллы на дюйм всегда 72; спасибо за ссылку Xetius.
Марк Рэнсом,
@ Кори Росс: На самом деле DPI будет зависеть от принтера, а PPI будет зависеть от монитора. Но все ошибочно называют PPI ​​DPI ...
Стефан Штайгер
58

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

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

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

Джоэл Кохорн
источник
23

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

  • В дюйме 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

так:

points = (pixels / 150) * 72    (3) for 150dpi system
Ян Бойд
источник
1
dpi в первом уравнении должно быть px - для исключения терминов, поскольку у нас есть предположение (1) для системы 150 dpi
Джейсон С.
9

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

Heind
источник
Также объясните, почему используется это значение ... По совпадению, это 96 точек на дюйм (DPI окон по умолчанию для дисплеев) / 72 точек на дюйм (точек на дюйм, для которых определены точки).
ВЫЙТИ - Anony-Mousse
5

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

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

spotcatbug
источник
4

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

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

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

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

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

points = pixels * 96 / 72
Дэвид
источник
1
Это неверно, если вы предполагаете 96 точек на дюйм и 72 точек на дюйм (точек на дюйм). Это будут точки = пиксели * 72/96
Джейсон С.
4

точки = (пикселей / 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

Бубба Тбон
источник
1

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

int pixels = (int)((dp) * Resources.System.DisplayMetrics.Density + 0.5f);
Майкл Чжан
источник
0

Использование 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

hasii
источник
-1

Высота линий преобразована в точки и пиксели (моя собственная формула). Вот пример с ручным вводом 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? Не знаю, но работает.)

Даниил
источник