แปลงพิกเซลเป็นคะแนน


126

ฉันมีความต้องการที่จะแปลง Pixels เป็น Points ใน C # ฉันเคยเห็นคำอธิบายที่ซับซ้อนเกี่ยวกับหัวข้อนี้ แต่ดูเหมือนจะหาสูตรง่ายๆไม่ได้ สมมติว่าเป็น 96dpi มาตรฐานฉันจะคำนวณการแปลงนี้ได้อย่างไร

คำตอบ:


200

มี72 คะแนนต่อนิ้ว ; ถ้ามันเพียงพอที่จะถือว่า 96 พิกเซลต่อนิ้วสูตรนี้ค่อนข้างง่าย:

จุด = พิกเซล * 72/96

ไม่มีทางที่จะได้รับการกำหนดค่าพิกเซลต่อนิ้วของจอแสดงผลของคุณใน Windows GetDeviceCapsใช้เป็น Microsoft มีคำแนะนำที่เรียกว่า"การพัฒนาแอปพลิเคชัน DPI-Aware"ให้ค้นหาส่วน "การสร้างแบบอักษร DPI-Aware"

W3C ได้กำหนดการวัดพิกเซลpxเป็น1/96 ของ 1 นิ้วโดยไม่คำนึงถึงความละเอียดที่แท้จริงของจอแสดงผลของคุณดังนั้นสูตรข้างต้นควรจะดีสำหรับงานเว็บทั้งหมด


26
72 คะแนนต่อนิ้วไม่ใช่ของที่เถียงได้มันเหมือนกันทั่วกระดาน!
Mitchel Sellers

11
@David dpi ขึ้นอยู่กับการแสดงผล ppi เป็นค่าคงที่ในการพิมพ์
Corey Ross

3
@David บทความนั้นอธิบายว่าเหตุใดจอภาพจึงมี DPI ตัวแปร PPI ยังเหมือนเดิม จำนวนกิโลเมตรในหนึ่งไมล์จะไม่เปลี่ยนแปลงขึ้นอยู่กับรถที่คุณขับ โดยทั่วไปแล้วสมมติว่า 96dpi ไม่ใช่ความคิดที่ดี แต่ถ้าเราทำเช่นนั้นแล้วสูตรที่ให้มานั้นถูกต้อง
Quentin

13
โดยปกติ PPI เป็นคำย่อของพิกเซลต่อนิ้วไม่ใช่จุดต่อนิ้ว บางทีนั่นอาจเป็นที่มาของความสับสน? คะแนนต่อนิ้วเสมอ 72; ขอบคุณสำหรับลิงค์ Xetius
Mark Ransom

@Corey Ross: จริงๆแล้ว DPI จะขึ้นอยู่กับเครื่องพิมพ์ในขณะที่ PPI จะอยู่ในจอภาพ แต่ทุกคนเรียก PPI DPI ผิด ...
Stefan Steiger

58

ลองทำเช่นนี้หากรหัสของคุณอยู่ในรูปแบบ:

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

2
มันคุ้มค่าที่จะชี้ให้เห็นว่า DpiX มีไว้สำหรับความกว้างซึ่งควรใช้ DpiY สำหรับความสูง?
PandaWood

25

สมมติว่า 96dpi เป็นความผิดพลาดอย่างมาก แม้ว่าสมมติฐานจะถูกต้อง แต่ก็มีตัวเลือกในการปรับขนาดแบบอักษร ดังนั้นชุดแบบอักษรสำหรับ 10pts อาจแสดงได้ราวกับว่าเป็น 12.5pt (125%)


23

เริ่มต้นด้วยสิ่งที่กำหนด:

  • มี 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

1
dpi ในสมการแรกควรเป็น px - สำหรับการยกเลิกเงื่อนไขเนื่องจากเรามีสมมติฐาน (1) สำหรับระบบ 150dpi
Jason S

9

WPF แปลงจุดเป็นพิกเซลด้วย System.Windows.FontSizeConverter FontSizeConverter ใช้ System.Windows.LengthConverter LengthConverter ใช้ปัจจัย 1.333333333333333333 เพื่อแปลงจากจุด (p) เป็นพิกเซล (x): x = p * 1.3333333333333333


โปรดอธิบายด้วยว่าทำไมจึงใช้ค่านี้ ... บังเอิญเป็น 96 dpi (DPI เริ่มต้นของ windows สำหรับการแสดงผล) / 72 dpi (DPI ที่กำหนดจุดไว้ที่)
มี QUIT - Anony-Mousse

5

System.Drawing.Graphics มีคุณสมบัติ DpiX และ DpiY DpiX คือพิกเซลต่อนิ้วในแนวนอน DpiY คือพิกเซลต่อนิ้วในแนวตั้ง ใช้สิ่งเหล่านี้เพื่อแปลงจากจุด (72 จุดต่อนิ้ว) เป็นพิกเซล

เช่น 14 จุดแนวนอน = (14 * DpiX) / 72 พิกเซล


4

แน่นอนว่าคำถามทั้งหมดนี้ควรเป็น:

"ฉันจะรับ PPI แนวนอนและแนวตั้ง (พิกเซลต่อนิ้ว) ของจอภาพได้อย่างไร"

มี 72 จุดในหนึ่งนิ้ว (ตามคำจำกัดความ "จุด" ถูกกำหนดให้เป็น 1/72 ของนิ้วในทำนองเดียวกัน "pica" ถูกกำหนดให้เป็น 1/72 ของฟุต) ด้วยข้อมูลสองบิตนี้คุณสามารถแปลงจาก px เป็น pt และย้อนกลับได้อย่างง่ายดาย


เพื่อให้ซับซ้อนยิ่งขึ้นฉันกำลังจัดการกับการจัดแนวสิ่งต่างๆในรายงาน Reporting Services (RDL) ซึ่งจะถูกแปลงเป็น PDF ในตอนท้ายของวันใครจะรู้ว่า DPI คืออะไร? ฉันใช้การเดาที่ดีที่สุดของฉัน :)
ทอดด์เดวิส

คุณหมายถึง "ฉันจะรับ DPI แนวนอนและแนวตั้งของจอภาพได้อย่างไร" PPI มีค่าคงที่ 72 เป็นค่าคงที่เสมอมา
Xetius

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 มาตรฐานที่ใช้ OSX (ค่าเริ่มต้นจากโรงงาน)

Windows ทำงานเป็นค่าเริ่มต้นที่ 96dpi (จอแสดงผล) Mac ทำงานเป็นค่าเริ่มต้นที่ 72 dpi (จอแสดงผล)

72 POSTSCRIPT Points = 1 นิ้ว 12 POSTSCRIPT Points = 1 POSTSCRIPT Pica 6 POSTSCRIPT Picas = 72 Points = 1 inch

1 จุด = 1⁄72 นิ้ว = 25.4⁄72 มม. = 0.3527 มม

DPI = จุดต่อนิ้ว PPI = พิกเซลต่อนิ้ว LPI = เส้นต่อนิ้ว

ข้อมูลเพิ่มเติมหากใช้ em เป็นการวัด

16px = 1em (ค่าเริ่มต้นสำหรับข้อความปกติ) 8em = 16px * 8 Pixels / 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 คะแนนในฟิลด์ Row Height:

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 ฉันไม่รู้ แต่มันใช้งานได้)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.