Мне нужно преобразовать пиксели в точки на С #. Я видел несколько сложных объяснений по этой теме, но не могу найти простой формулы. Предположим, стандартное 96 точек на дюйм, как мне рассчитать это преобразование?
Мне нужно преобразовать пиксели в точки на С #. Я видел несколько сложных объяснений по этой теме, но не могу найти простой формулы. Предположим, стандартное 96 точек на дюйм, как мне рассчитать это преобразование?
Ответы:
Есть 72 точки на дюйм ; если достаточно предположить 96 пикселей на дюйм, формула довольно проста:
точки = пикселей * 72/96
Есть способ получить настроенные пиксели на дюйм вашего дисплея в Windows с помощью GetDeviceCaps
. У Microsoft есть руководство под названием «Разработка приложений с поддержкой DPI». , найдите раздел «Создание шрифтов с поддержкой DPI».
W3C определил размер пикселя px
как ровно 1/96 от 1 дюйма независимо от фактического разрешения вашего дисплея, поэтому приведенная выше формула должна быть полезна для любой работы в Интернете.
Предположение, что 96 точек на дюйм - огромная ошибка. Даже если предположение верно, есть возможность масштабировать шрифты. Таким образом, шрифт, установленный на 10 пунктов, на самом деле может отображаться так, как если бы он был 12,5 пунктов (125%).
Начиная с данного:
Если вы хотите найти точки (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
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? Не знаю, но работает.)