Chuyển đổi pixel thành điểm


125

Tôi có nhu cầu chuyển đổi Pixels thành Điểm trong C #. Tôi đã thấy một số giải thích phức tạp về chủ đề này, nhưng dường như không thể tìm thấy một công thức đơn giản. Giả sử 96dpi tiêu chuẩn, làm cách nào để tính toán chuyển đổi này?

Câu trả lời:


198

72 điểm mỗi inch ; nếu đủ để giả định 96 pixel mỗi inch, thì công thức khá đơn giản:

điểm = pixel * 72/96

Có một cách để lấy các pixel được định cấu hình trên mỗi inch của màn hình của bạn trong Windows bằng cách sử dụng GetDeviceCaps. Microsoft có một hướng dẫn gọi là "Phát triển ứng dụng Aware DPI" , hãy tìm phần "Tạo phông chữ DPI-Aware".

W3C đã xác định phép đo pixel pxlà chính xác 1/96 của 1in bất kể độ phân giải thực của màn hình của bạn là bao nhiêu, vì vậy công thức trên phải phù hợp với mọi công việc trên web.


26
72 điểm trên mỗi inch KHÔNG phải là một mục có thể tranh cãi, nó là như nhau trên bảng!
Người bán Mitchel

11
@David dpi phụ thuộc vào màn hình, ppi là hằng số chính tả
Corey Ross

3
@David bài viết đó chỉ giải thích tại sao màn hình có DPI thay đổi. PPI vẫn vậy. Số km trong một dặm không thay đổi tùy thuộc vào chiếc xe bạn lái. Giả sử 96dpi nói chung không phải là một ý tưởng tốt, nhưng nếu chúng ta làm điều đó thì công thức đã cho là đúng.
Quentin

13
Thông thường PPI là chữ viết tắt cho pixel trên inch, không phải điểm trên inch. Có lẽ đó là nơi mà sự nhầm lẫn đến từ đâu? Điểm trên mỗi inch luôn là 72; cảm ơn vì liên kết Xetius.
Đánh dấu tiền chuộc

@Corey Ross: Trên thực tế, DPI sẽ phụ thuộc vào máy in, trong khi PPI sẽ phụ thuộc vào màn hình. Nhưng mọi người gọi nhầm PPI DPI ...
Stefan Steiger

58

Hãy thử điều này nếu mã của bạn nằm trong một hình thức:

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

2
Có đáng để chỉ ra rằng DpiX dành cho Chiều rộng trong đó DpiY nên được sử dụng cho chiều cao không?
PandaWood

25

Giả sử 96dpi là một sai lầm rất lớn . Ngay cả khi giả định là đúng, cũng có một tùy chọn để chia tỷ lệ phông chữ. Vì vậy, một phông chữ được đặt trong 10pts thực sự có thể được hiển thị như thể nó là 12,5pt (125%).


23

Bắt đầu với cái đã cho:

  • Có 72 điểm trong một inch (đó là một điểm là 1/72 inch)
  • trên hệ thống được đặt cho 150dpi, có 150 pixel mỗi inch.
  • 1 in = 72pt = 150px (đối với cài đặt 150dpi)

Nếu bạn muốn tìm điểm (pt) dựa trên pixel (px):

 72 pt    x pt
------ = -----                  (1) for 150dpi system
150 px    y px

Sắp xếp lại:

x = (y/150) * 72                (2) for 150dpi system

vì thế:

points = (pixels / 150) * 72    (3) for 150dpi system

1
dpi trong phương trình đầu tiên phải là px - để hủy các điều khoản, vì chúng ta có giả định (1) cho hệ 150dpi
Jason S

9

WPF chuyển đổi các điểm thành pixel bằng System.Windows.FontSizeConverter. FontSizeConverter sử dụng System.Windows.LdropsConverter. LengthConverter sử dụng hệ số 1.333333333333333333 để chuyển đổi từ điểm (p) sang pixel (x): x = p * 1.3333333333333333


Cũng vui lòng giải thích lý do tại sao giá trị này được sử dụng ... Thật trùng hợp, nó là 96 dpi (DPI mặc định của các cửa sổ để hiển thị) / 72 dpi (DPI mà các điểm được xác định tại).
Có QUIT - Anony-Mousse

5

System.Drawing.Graphics có các thuộc tính DpiX và DpiY. DpiX là pixel trên mỗi inch theo chiều ngang. DpiY là pixel trên mỗi inch theo chiều dọc. Sử dụng những cái đó để chuyển đổi từ điểm (72 điểm mỗi inch) sang pixel.

Ví dụ: 14 điểm ngang = (14 * DpiX) / 72 pixel


4

Chắc chắn toàn bộ câu hỏi này nên là:

"Làm cách nào để có được PPI ngang và dọc (Pixels Per Inch) của màn hình?"

Có 72 điểm trong một inch (theo định nghĩa, "điểm" được định nghĩa là 1/72 inch, tương tự "pica" được định nghĩa là 1/72 của một feet). Với hai bit thông tin này, bạn có thể chuyển đổi từ px sang pt và quay lại rất dễ dàng.


Để làm cho nó phức tạp hơn nữa, tôi đang xử lý việc sắp xếp mọi thứ trên báo cáo Dịch vụ báo cáo (RDL) đang được chuyển đổi thành PDF. Vào cuối ngày, ai là người biết DPI là gì? Tôi đang sử dụng dự đoán tốt nhất của tôi. :)
Todd Davis

Bạn có nghĩa là "Làm thế nào để tôi có được DPI ngang và dọc của màn hình?". PPI là hằng số 72. Luôn luôn và sẽ luôn như vậy.
Xetius

1
Điểm ảnh trên mỗi inch, không phải điểm trên mỗi inch (Pica).
JeeBee

1
Ừm, ôi, không phải Pica! Đó là 1/6 inch. Điểm trên mỗi inch là dư thừa, thuật ngữ là "Điểm". "Điểm" là 1/72 của Inch.
JeeBee

4

Thật ra nó phải

points = pixels * 96 / 72

1
Điều này là không chính xác nếu bạn đang giả định 96dpi và 72ppi (điểm trên mỗi inch). Đó sẽ là điểm = pixel * 72/96
Jason S

4

điểm = (pixel / 96) * 72 trên máy XP / Vista / 7 tiêu chuẩn (mặc định của nhà máy)

điểm = (pixel / 72) * 72 trên máy Mac tiêu chuẩn chạy OSX (Mặc định của nhà máy)

Windows chạy như mặc định ở 96dpi (hiển thị) Máy Mac chạy như mặc định ở 72 dpi (hiển thị)

72 POSTSCRIPT Điểm = 1 inch 12 POSTSCRIPT Điểm = 1 POSTSCRIPT Pica 6 POSTSCRIPT Picas = 72 Điểm = 1 inch

1 điểm = 1⁄72 inch = 25,4⁄72 mm = 0,3527 mm

DPI = Dots Per Inch PPI = Pixels Per Inch LPI = Lines per inch

Thông tin thêm nếu sử dụng em làm thước đo

16px = 1em (mặc định cho văn bản thông thường) 8em = 16px * 8 Pixels / 16 = em


1

Những công việc này:

int pixels = (int)((dp) * Resources.System.DisplayMetrics.Density + 0.5f);

0

Sử dụng wxPython trên Mac để có được DPI chính xác như sau:

    from wx import ScreenDC
    from wx import Size

    size: Size = ScreenDC().GetPPI()
    print(f'x-DPI: {size.GetWidth()} y-DPI: {size.GetHeight()}')

Sản lượng này:

x-DPI: 72 y-DPI: 72

Do đó, công thức là:

điểm: int = (pixelNumber * 72) // 72


-1

Các dòng chiều cao được chuyển đổi thành điểm và pixel (công thức của riêng tôi). Dưới đây là một ví dụ với mục nhập thủ công 213,67 điểm trong trường Chiều cao hàng:

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

Ở đây, mục nhập thủ công 213,67 điểm cho ra 284 pixel.
Ở đây, mục nhập thủ công 213,68 điểm cho 285 pixel.

(Tại sao 0,45? Tôi không biết nhưng nó hoạt động.)

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.