Преобразование пикселей в точки
Мне нужно преобразовать пиксели в точки в C #. Я видел несколько сложных объяснений по теме, но не могу найти простой формулы. Предположим, что стандартное 96dpi, как я могу это преобразовать?
- Понимание аутентификации Windows WCF
- Каково поведение целочисленного деления?
- Деструктор против IDisposable?
- Определения функций C / C ++ без сборки
- Сбой разрешения перегрузки при streamовом объекте через неявное преобразование в строку
- «Недостижимая прямая база», вызванная множественным наследованием
- Форматирование ReSharper: выравнивание равных операндов
- C указатель на массив / массив значений указателей
Есть 72 точки на дюйм ; если достаточно принять 96 пикселей на дюйм, формула довольно проста:
точки = пиксели * 72/96
Существует способ получить настроенные пиксели на дюйм вашего дисплея в Windows с помощью GetDeviceCaps
. В Microsoft есть руководство под названием «Разработка приложений DPI-Aware» , найдите раздел «Создание шрифтов DPI-Aware».
W3C определил пиксельное измерение px
как точно 1 / 96th of 1in независимо от фактического разрешения вашего дисплея, поэтому приведенная выше формула должна быть хорошей для всех веб-работ.
Попробуйте это, если ваш код находится в форме:
Graphics g = this.CreateGraphics(); points = pixels * 72 / g.DpiX; g.Dispose();
Предполагая, что 96dpi – огромная ошибка. Даже если предположение верно, существует также возможность масштабирования шрифтов. Таким образом, шрифт, установленный для 10pts, может быть показан как 12.5pt (125%).
Начиная с данного:
- Есть 72 точки в дюйме (это то, что точка, 1/72 дюйма)
- на системе, установленной для 150dpi, есть 150 пикселей на дюйм.
- 1 in = 72pt = 150px (для настройки 150dpi)
Если вы хотите найти точки (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. The 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-й дюйма, также «pica» определяется как 1/72-й ноги). С этими двумя битами информации вы можете легко конвертировать из px в pt и обратно.
На самом деле это должно быть
points = pixels * 96 / 72
точек = (пикселей / 96) * 72 на стандартной машине XP / Vista / 7 (заводские настройки по умолчанию)
point = (pixels / 72) * 72 на стандартном Mac, работающем под управлением OSX (по умолчанию)
Windows работает по умолчанию с разрешением 96 точек на дюйм (отображение) Mac запускаются по умолчанию при 72 dpi (дисплей)
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);
Строки высоты преобразуются в точки и пиксель (моя собственная формула). Вот пример с ручным вводом 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? Я не знаю, но это работает.)