ฉันมีความต้องการที่จะแปลง Pixels เป็น Points ใน C # ฉันเคยเห็นคำอธิบายที่ซับซ้อนเกี่ยวกับหัวข้อนี้ แต่ดูเหมือนจะหาสูตรง่ายๆไม่ได้ สมมติว่าเป็น 96dpi มาตรฐานฉันจะคำนวณการแปลงนี้ได้อย่างไร
ฉันมีความต้องการที่จะแปลง Pixels เป็น Points ใน C # ฉันเคยเห็นคำอธิบายที่ซับซ้อนเกี่ยวกับหัวข้อนี้ แต่ดูเหมือนจะหาสูตรง่ายๆไม่ได้ สมมติว่าเป็น 96dpi มาตรฐานฉันจะคำนวณการแปลงนี้ได้อย่างไร
คำตอบ:
มี72 คะแนนต่อนิ้ว ; ถ้ามันเพียงพอที่จะถือว่า 96 พิกเซลต่อนิ้วสูตรนี้ค่อนข้างง่าย:
จุด = พิกเซล * 72/96
ไม่มีทางที่จะได้รับการกำหนดค่าพิกเซลต่อนิ้วของจอแสดงผลของคุณใน Windows GetDeviceCaps
ใช้เป็น Microsoft มีคำแนะนำที่เรียกว่า"การพัฒนาแอปพลิเคชัน DPI-Aware"ให้ค้นหาส่วน "การสร้างแบบอักษร DPI-Aware"
W3C ได้กำหนดการวัดพิกเซลpx
เป็น1/96 ของ 1 นิ้วโดยไม่คำนึงถึงความละเอียดที่แท้จริงของจอแสดงผลของคุณดังนั้นสูตรข้างต้นควรจะดีสำหรับงานเว็บทั้งหมด
ลองทำเช่นนี้หากรหัสของคุณอยู่ในรูปแบบ:
Graphics g = this.CreateGraphics();
points = pixels * 72 / g.DpiX;
g.Dispose();
สมมติว่า 96dpi เป็นความผิดพลาดอย่างมาก แม้ว่าสมมติฐานจะถูกต้อง แต่ก็มีตัวเลือกในการปรับขนาดแบบอักษร ดังนั้นชุดแบบอักษรสำหรับ 10pts อาจแสดงได้ราวกับว่าเป็น 12.5pt (125%)
เริ่มต้นด้วยสิ่งที่กำหนด:
หากคุณต้องการค้นหาจุด (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 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 มาตรฐาน (ค่าเริ่มต้นจากโรงงาน)
จุด = (พิกเซล / 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
ใช้งานได้:
int pixels = (int)((dp) * Resources.System.DisplayMetrics.Density + 0.5f);
ใช้ 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
เส้นความสูงแปลงเป็นจุดและพิกเซล (สูตรของฉันเอง) นี่คือตัวอย่างที่มีการป้อนด้วยตนเอง 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 ฉันไม่รู้ แต่มันใช้งานได้)