سؤال

أنا أتطلع لتحويل البكسل إلى بوصة والعكس.أدرك أنني بحاجة إلى DPI، لكنني لست متأكدًا من كيفية الحصول على هذه المعلومات (على سبيل المثال.ليس لدي Graphics كائن، لذلك هذا ليس خيارا).

هل هناك طريقة؟

هل كانت مفيدة؟

المحلول

في جهاز الفيديو، أي الإجابة على هذا السؤال هي عادة ليست دقيقة جدا. أسهل مثال لاستخدام لنرى لماذا هذا هو الحال هو العرض. قرار الإخراج، ويقول، 1024x768، ولكن DPI يختلف حسب مدى بعيدا الشاشة من apeture العرض. برنامج الأغذية العالمي، على سبيل المثال، يفترض دائما 96 DPI على جهاز الفيديو.

وعلى افتراض انك لا تزال بحاجة إلى إجابة، بغض النظر عن دقة، ولم يكن لديك كائن الرسومات، يمكنك إنشاء واحد من الشاشة مع بعض P / استدعاء واحصل على الجواب عن ذلك.

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);

نصائح أخرى

لا توجد طريقة حقيقية فعليًا دون معرفة DPI.وحدات البكسل منفصلة، ​​والبوصات ليست كذلك، إذا كنت تتحدث بالبوصات على شاشتك، فأنت بحاجة إلى معرفة (على الأقل) الدقة (ونسبة العرض إلى الارتفاع للبكسل) وحجم منطقة الشاشة المرئية من أجل حساب DPI الخاص بك .عادةً ما يكون من الممكن جلب الدقة من مكان ما (أنا لست مبرمج C# أو .NET، لذا لا يمكنني مساعدتك هناك)، لكن حجم الشاشة لا يكون متاحًا عادةً.إذا كان التقدير جيدًا بما يكفي، فاطلب من المستخدم إدخال حجم الشاشة (أي حجم الشاشة).21 "أو أيًا كان) وحل DPI:

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

العطاء (على افتراض أنك تعرف القطر والدقة)

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

هذا مجرد تقدير، حيث أن الشاشات لا تبلغ أبدًا 21 بوصة بالضبط (..أو أيًا كان)، ولا تكاد تكون نسبة العرض إلى الارتفاع للبكسل 1:1 تمامًا.

إذا كنت تتحدث عن البوصات على الورق، فمن الطبيعي أن تحتاج إلى معرفة DPI الخاصة بالطابعة (أو بشكل أكثر دقة، إعدادات الطابعة الحالية).

ويمكنك إنشاء الرسومات كائن ببساطة عن طريق الاتصال this.CreateGraphics() (أو أكثر عموما Control.CreateGraphics()) ومن ثم استخدام خصائص DpiX وDpiY كما يبدو لك أن تعرف. فقط تذكر للتخلص الكائن الرسومات بعد إنشائه (مثالي مع بيان طريق).

إذا كنت لا تستخدم WinForms عناصر، ثم اسمحوا لنا أن نعرف أي نوع من التطبيق هو عليه.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top