Перетворити пікселі в очки


126

У мене є необхідність конвертувати пікселі в точки в C #. Я бачив кілька складних пояснень щодо цієї теми, але не можу знайти просту формулу. Припустимо, стандартний 96dpi, як я визначити цю конверсію?

Відповіді:


199

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

бали = пікселі * 72/96

Існує спосіб отримати налаштовані пікселі на дюйм вашого дисплея за допомогою Windows GetDeviceCaps. Microsoft має посібник під назвою "Розробка програм DPI-Aware" , шукайте розділ "Створення шрифтів DPI-Aware".

W3C визначив вимірювання пікселів pxяк рівно 1/96 частини 1 дюйму незалежно від фактичної роздільної здатності вашого дисплея, тому вищевказана формула повинна бути хорошою для всієї роботи в Інтернеті.


26
72 бали за дюйм НЕ є предметом, який сперечається, він однаковий у всій плані!
Продавці Мітчела

11
@David dpi залежить від дисплея, ppi - типографічна константа
Corey Ross

3
@Давид ця стаття просто пояснює, чому монітори мають змінний DPI. ІЦВ все одно. Кількість кілометрів у милі не змінюється залежно від автомобіля, яким ви їдете. Припустимо, що 96dpi - це загалом не дуже гарна ідея, але якщо ми це зробимо, то дана формула є правильною.
Квентін

13
Зазвичай PPI - це абревіатура для пікселів на дюйм, а не балів на дюйм. Можливо, звідси походить плутанина? Бали за дюйм завжди 72; дякую за посилання Xetius.
Марк Рансом

@Corey Ross: Насправді, DPI буде залежати від принтера, тоді як PPI буде залежати від монітора. Але всі помилково називають PPI DPI ...
Стефан Штайгер

58

Спробуйте це, якщо ваш код лежить у формі:

Graphics g = this.CreateGraphics();
points = pixels * 72 / g.DpiX;
g.Dispose();

2
Чи варто вказувати, що DpiX призначений для Width, де DpiY слід використовувати для висоти?
PandaWood

25

Якщо припустити 96dpi - це величезна помилка. Навіть якщо припущення правильне, також існує можливість масштабування шрифтів. Тож набір шрифтів у 10 копійок може відображатись так, ніби він 12,5пт (125%).


23

Починаючи з даного:

  • У дюймі 72 пункти (тобто, яка точка, 1/72 дюйма)
  • в системі, встановленій на 150 dpi, є 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

1
dpi в першому рівнянні має бути px - для скасування термінів, оскільки у нас є припущення (1) для системи 150dpi
Jason S

9

WPF перетворює точки в пікселі за допомогою System.Windows.FontSizeConverter. FontSizeConverter використовує System.Windows.LengthConverter. LongConverter використовує коефіцієнт 1.333333333333333333 для перетворення з точок (p) в пікселі (x): x = p * 1.3333333333333333


Будь ласка, поясніть, чому це значення використовується ... Випадково, це 96 dpi (за замовчуванням DPI вікон для дисплеїв) / 72 dpi (DPI, які визначаються в точках).
Мав QUIT - Anonymous-Mousse

5

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

Наприклад: 14 горизонтальних точок = (14 * DpiX) / 72 пікселів


4

Безумовно, все це питання повинно бути:

"Як мені отримати горизонтальну та вертикальну ІРЦ (пікселі на дюйм) монітора?"

У дюймі є 72 точки (за визначенням, "точка" визначається як 1/72 дюйма, аналогічно "піка" визначається як 1/72 фута). За допомогою цих двох бітів інформації ви можете легко перетворити з px в pt і назад дуже легко.


Щоб зробити це ще складніше, я маю справу з вирівнюванням речей у звіті Служб звітності (RDL), який перетворюється у PDF. Зрештою, хто чорт знає, що таке ДПІ? Я використовую свої найкращі здогадки. :)
Тодд Девіс,

Ви маєте на увазі "Як мені отримати горизонтальну та вертикальну DPI монітора?". ІЦН - це константа 72. Завжди була і завжди буде.
Ксетій

1
Пікселі на дюйм, а не бали за дюйм (Pica).
JeeBee

1
Гм, ой, не Піка! Це 1/6 дюйма. Бали за дюйм зайві, термін - "Бали". "Точка" - це 1/72 дюйма.
JeeBee

4

Насправді так і має бути

points = pixels * 96 / 72

1
Це неправильно, якщо ви вважаєте, що 96dpi та 72ppi (бали на дюйм). Це будуть очки = пікселі * 72/96
Jason S

4

бали = (пікселі / 96) * 72 на стандартній машині XP / Vista / 7 (заводські настройки)

бали = (пікселі / 72) * 72 на стандартному Mac OS OS (Заводські настройки)

Windows працює за замовчуванням при 96dpi (дисплей) Маки працюють за замовчуванням при 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 = лінії на дюйм

Більше інформації, якщо використовувати їх як вимірювання

16px = 1em (стандартний текст за замовчуванням) 8em = 16px * 8 пікселів / 16 = em



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


-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? Я не знаю, але це працює.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.