2009-01-23 13 views
7

में इसके विपरीत मैं पिक्स को इंच और इसके विपरीत रूपांतरित करने के लिए देख रहा हूं। मैं समझता हूं कि मुझे डीपीआई की आवश्यकता है, लेकिन मुझे यकीन नहीं है कि यह जानकारी कैसे प्राप्त करें (उदा। मेरे पास Graphics ऑब्जेक्ट नहीं है, इसलिए यह कोई विकल्प नहीं है)।पिक्सल को इंच में बदलें और सी #

क्या कोई तरीका है?

+0

डीपीआई क्या? स्क्रीन? मुद्रक? ...? –

उत्तर

7

वीडियो डिवाइस पर, इस प्रश्न का कोई भी जवाब आम तौर पर बहुत सटीक नहीं है। यह देखने का सबसे आसान उदाहरण यह है कि यह एक प्रोजेक्टर क्यों है। आउटपुट रेज़ोल्यूशन कहता है, 1024x768, लेकिन डीपीआई प्रोजेक्टर एपेटर से कितनी दूर है, इस बात से भिन्न होता है। डब्ल्यूपीएफ, उदाहरण के लिए, हमेशा एक वीडियो डिवाइस पर 96 डीपीआई मानता है।

सटीकता के बावजूद आपको अभी भी एक जवाब की आवश्यकता है, और आपके पास ग्राफिक्स ऑब्जेक्ट नहीं है, तो आप कुछ पी/आमंत्रण के साथ स्क्रीन से एक बना सकते हैं और इसका उत्तर प्राप्त कर सकते हैं।

Single xDpi, yDpi; 

IntPtr dc = GetDC(IntPtr.Zero); 

using(Graphics g = Graphics.FromHdc(dc)) 
{ 
    xDpi = g.DpiX; 
    yDpi = g.DpiY; 
} 

if (ReleaseDC(IntPtr.Zero) != 0) 
{ 
    // GetLastError and handle... 
} 


[DllImport("user32.dll")] 
private static extern IntPtr GetDC(IntPtr hwnd);  
[DllImport("user32.dll")] 
private static extern Int32 ReleaseDC(IntPtr hwnd); 
+0

उपयोगकर्ता जो मांग रहा था उसके आधार पर, यह स्वीकार्य उत्तर होना चाहिए। – epotter

6

डीपीआई को जानने के बिना शारीरिक रूप से कोई वास्तविक तरीका नहीं है। पिक्सेल अलग हैं, इंच नहीं हैं, अगर आप अपने मॉनीटर पर इंच बोल रहे हैं, तो आपको अपने डीपीआई की गणना करने के लिए संकल्प (और पिक्सेल पहलू अनुपात) और दृश्यमान मॉनीटर क्षेत्र का आकार जानने की आवश्यकता है (कम से कम) । संकल्प आमतौर पर कहीं लाने के लिए संभव है (मैं सी # या .NET प्रोग्रामर नहीं हूं, इसलिए मैं आपकी मदद नहीं कर सकता), लेकिन मॉनीटर का आकार आमतौर पर उपलब्ध नहीं होता है। एक अनुमान अच्छा है पर्याप्त तो उपयोगकर्ता मॉनिटर (यानी 21 "या जो कुछ भी) के आकार दर्ज करें और डीपीआई के लिए हल है:

(resX/DPI)^2 + (resY/DPI)^2 = screenDiagonal^2 

दे रही है (यह मानते हुए आप विकर्ण और समाधान की जानकारी)

DPI = sqrt(resX^2+resY^2)/screenDiagonal 

यह सिर्फ एक अनुमान है, क्योंकि मॉनीटर बिल्कुल 21 "(.. या जो भी नहीं) हैं, और पिक्सेल पहलू अनुपात शायद ही कभी 1: 1 है।

यदि आप कागज पर इंच बोल रहे हैं, तो, स्वाभाविक रूप से आपको अपने प्रिंटर के डीपीआई (या अधिक सटीक रूप से, मौजूदा प्रिंटर सेटिंग्स) को जानने की आवश्यकता है।

+0

इसलिए दिया गया कि मेरे पास ग्राफिक्स ऑब्जेक्ट तक पहुंच नहीं है, मैं डीपीआई की गणना कैसे करूं? – AngryHacker

+0

डीपीआई के लिए समीकरण हल करें, मान लीजिए कि बाकी को जाना जाता है। – falstro

+0

मैं मॉनीटर की विकर्ण लंबाई कैसे जानूंगा? मेरा ऐप उन कंप्यूटरों पर चलाएगा जिन्हें मैं नियंत्रित नहीं करता हूं। – AngryHacker

1

आप this.CreateGraphics() (या अधिक आम तौर पर Control.CreateGraphics()) पर कॉल करके ग्राफिक्स ऑब्जेक्ट बना सकते हैं और फिर डीपीआईएक्स और डीपीआईवाई गुणों का उपयोग कर सकते हैं जैसा आपको लगता है। बस इसे बनाने के बाद ग्राफिक्स ऑब्जेक्ट का निपटान करना याद रखें (आदर्श रूप से उपयोग कथन के साथ)।

यदि आप WinForms का उपयोग नहीं कर रहे हैं, तो कृपया हमें बताएं कि यह किस प्रकार का एप्लिकेशन है।

+0

मैं नहीं कर सकता। मैं एक ActiveReports रिपोर्ट शीट की कोड-बैक फ़ाइल में कोड लिख रहा हूं। इसमें इन गुण नहीं हैं। – AngryHacker

+0

उन्होंने कहा कि वह WPF का उपयोग कर रहा है, जो WinForms नहीं है। दोनों एक साथ का उपयोग गंभीर सिरदर्द का कारण बन सकता है। – mmr

+0

@mmr: नहीं, उसने यह नहीं बताया कि वह WPF का उपयोग कर रहा है। वास्तव में, 'ग्राफिक' का संदर्भ WinForms को दृढ़ता से इंगित करता है। वैसे भी, वोट-वोट के लिए धन्यवाद। – Noldorin

संबंधित मुद्दे