Мне нужно преобразовать пиксели в точки на C #. Я видел несколько сложных объяснений по этой теме, но не могу найти простой формулы. Предположим, стандартное 96 точек на дюйм, как мне рассчитать это преобразование?
Преобразовать пиксели в точки
Ответы (12)
Есть 72 точки на дюйм; если достаточно принять 96 пикселей на дюйм, формула довольно проста:
точки = пикселей * 72/96
Есть способ получить настроенные пиксели на дюйм вашего дисплея в Windows, используя _ 1_. У Microsoft есть руководство под названием «Разработка приложений с поддержкой DPI», ищите раздел «Создание шрифтов с учетом DPI».
W3C определил измерение px
в пикселях как точно 1/96 часть 1 дюйма независимо от фактического разрешения вашего дисплея, поэтому приведенная выше формула должна подходить для любой работы в Интернете.
Попробуйте это, если ваш код находится в форме:
Graphics g = this.CreateGraphics();
points = pixels * 72 / g.DpiX;
g.Dispose();
Предполагая, что 96 точек на дюйм - это огромная ошибка. Даже если предположение верно, есть возможность масштабировать шрифты. Таким образом, шрифт, установленный на 10 пунктов, на самом деле может отображаться так, как если бы он был 12,5 пунктов (125%).
Начиная с данного:
- В дюйме 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
WPF преобразует точки в пиксели с помощью System.Windows.FontSizeConverter. FontSizeConverter использует System.Windows.LengthConverter. LengthConverter использует коэффициент 1,333333333333333333 для преобразования точек (p) в пиксели (x): x = p * 1,3333333333333333
System.Drawing.Graphics имеет свойства DpiX и DpiY. DpiX - это количество пикселей на дюйм по горизонтали. DpiY - это количество пикселей на дюйм по вертикали. Используйте их для преобразования точек (72 точки на дюйм) в пиксели.
Пример: 14 точек по горизонтали = (14 * DpiX) / 72 пикселя.
Наверняка весь этот вопрос должен быть таким:
«Как мне получить горизонтальный и вертикальный PPI (пикселей на дюйм) монитора?»
В дюйме 72 точки (по определению «точка» определяется как 1/72 дюйма, аналогично «пика» определяется как 1/72 дюйма). С помощью этих двух битов информации вы можете очень легко конвертировать из px в pt и обратно.
На самом деле это должно быть
points = pixels * 96 / 72
точки = (пикселей / 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
Это работает:
int pixels = (int)((dp) * Resources.System.DisplayMetrics.Density + 0.5f);
Использование 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
Высота линий преобразована в точки и пиксели (моя собственная формула). Вот пример с ручным вводом 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? Не знаю, но работает.)