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

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

Есть 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? Я не знаю, но это работает.)

  • Почему (int) (объект) 10m бросает исключение «Указанный приведение недействителен»?
  • C ++ Метод статического члена вызывает экземпляр classа
  • Могу ли я проверить, существует ли почтовый адрес с использованием .net?
  • MVCBuildViews работают неправильно
  • «Ньютонсофт» не найден
  • Почему lambda C ++ 11 требует по умолчанию «изменяемого» ключевого слова для захвата по значению?
  • Поддерживает ли URL-адрес шаблона угловой маршрутизации файлы * .cshtml в ASP.Net MVC 5 Project?
  • Как обновить c # dataGridView после обновления?
  • Установите компилятор C ++ на старый компьютер MS-DOS с дискетами
  • Сериализуемые classы и динамические прокси в EF - как?
  • Код C ++ для проверки гипотезы Collatz быстрее, чем assembly вручную - почему?
  • Давайте будем гением компьютера.