WebHU - Programozási kérdések és válaszok

Hogyan határozhatom meg a monitorom valódi pixelméretét .NET-ben?

Szeretnék egy képet "valódi méretben" megjeleníteni az alkalmazásomban. Ehhez tudnom kell a kijelző pixelméretét.

Tudom, hogy a Windows kijelző felbontása névlegesen 96 dpi, de az én céljaim érdekében jobb tippet szeretnék. Megértem, hogy ezek az információk nem mindig állnak rendelkezésre vagy nem pontosak (pl. régebbi CRT-kijelzők), de úgy gondolom, hogy az LCD-kijelzők elterjedésével ez lehetséges!

Van mód a kijelzőm pixelméretére?

Van mód annak megállapítására, hogy a pixelméret pontos-e?

A .NET API-t részesítik előnyben (nem találtam őket), de a Win32 is rendben van, szívesen P/Invoke-ot.

07.01.2009

Válaszok:


1

A kijelző méretéhez a következőt kell használnia: Screen .PrimaryScreen.Bounds.Size (vagy Screen.GetBounds(myform)).

Ha DPI-t szeretne, használja a DpiX és DpiY tulajdonságai http://msdn.microsoft.com/en-us/library/system.drawing.graphics.aspx" rel="noreferrer">Grafika:

PointF dpi = PointF.Empty;
using(Graphics g = this.CreateGraphics()){
    dpi.X = g.DpiX;
    dpi.Y = g.DpiY;
}

Ó várj! Azt akartad, hogy valódi, tarts egy vonalzót a monitorhoz, és mérj, méretet?! Nem. Nem lehetséges bármely operációs rendszer szolgáltatás használatával. Az operációs rendszer nem ismeri a monitor tényleges méreteit, sem azt, hogy a felhasználó hogyan kalibrálta. Ezen információk egy része elméletileg kimutatható, de nem elég determinisztikus ahhoz, hogy az operációs rendszer megbízhatóan használja, ezért nem.

Kerülendő megoldásként kipróbálhat néhány dolgot.

  • Megpróbálhatja lekérdezni a telepített monitor eszköz megjelenítési karakterláncát (nem tudom, hogyan kell ezt megtenni), és megnézheti, hogy abból ki lehet-e elemezni egy értelmes méretet. Például lehet, hogy a monitor egy "ValueBin E17p", és ebből lehet kikövetkeztetni, hogy 17"-es monitor. Természetesen ez a megjelenítési karakterlánc valószínűleg "Plug and Play Monitor". Ez a séma a legjobb esetben is meglehetősen vázlatos.
  • Megkérdezheti a felhasználót, hogy milyen méretű monitorral rendelkezik. Talán tudni fogják.

Ha már ismeri (vagy gondolja), hogy ismeri a monitor átlójának méretét, meg kell találnia a fizikai képarányát. Még egyszer, egy-két dolog:

  • Tegyük fel, hogy az aktuális képpont-arány megegyezik a monitor fizikai képarányával. Ez azt feltételezi, hogy (A) a felhasználó olyan felbontást választott, amely ideális a monitorjához, és (B) a monitor négyzetes pixelekkel rendelkezik. Nem tudok olyan jelenlegi fogyasztó-orientált számítógép-monitorról, amiben ne lenne négyzetes pixel, de a régebbieken igen, az újabbakon viszont igen.
  • Kérdezze meg a felhasználót. Talán tudni fogják.

Ha ismeri (vagy gondolja, tudja), hogy mekkora a monitor átlós mérete és fizikai képaránya, akkor kiszámíthatja a fizikai szélességét és magasságát. A2 + B2 = C2, így néhány számítással jó lesz:

Ha rájött, hogy ez egy 17 hüvelykes monitor, és a jelenlegi felbontása 1280 x 1024:
12802 + 10242 = 2686976
Sqrt(2686976 ) = 1639.1998047828092637409837247032
17" * 1280 / 1639.2 = 13.274768179599804782820888238165" *9 = 138165" *9 = 13,9" *9 = 13,9" *9 = 13,9" 14543679843826256710590532"

Ezzel a fizikai szélesség 13,27 hüvelyk, a fizikai magasság pedig 10,62 hüvelyk. Így a pixelek mérete 13,27" / 1280 = 10,62" / 1024 = 0,01037" vagy körülbelül 0,263 mm.

Természetesen mindez érvénytelen, ha a felhasználó nem rendelkezik megfelelő felbontással, a monitor nem négyzet alakú pixelekkel rendelkezik, vagy régebbi analóg monitorról van szó, és a kezelőszervek nincsenek megfelelően beállítva, hogy a kijelző kitöltse a teljes fizikai területet. képernyő. Vagy ami még rosszabb, lehet projektor is.

Végül talán a legjobb, ha egy kalibrálási lépést hajt végre, ahol a felhasználó valójában a képernyőhöz tart egy vonalzót, és megméri valami méretét. Te tudnál:

  • Kérje meg a felhasználót, hogy kattintson az egérrel bármelyik két, egymástól hüvelyknyi (vagy centiméteres) pontra.
  • Rajzoljon egy négyzetet a képernyőre, és kérje meg a felhasználót, hogy a fel és le nyilak megnyomásával állítsa be a magasságát, a bal és jobb nyilat pedig a szélességének beállításához, amíg a doboz pontosan egy hüvelykes (vagy centiméteres) négyzet lesz a vonalzójuk szerint.
  • Rajzoljon egy dobozt a képernyőre, és kérje meg a felhasználót, hogy mondja meg, hány hüvelyk/centiméter az egyes dimenziókban.

Bármit csinál is, ne várja el, hogy az eredmények 100%-ban pontosak legyenek. Túl sok tényező játszik szerepet az Ön (vagy a felhasználó) számára ahhoz, hogy ez minden alkalommal pontosan helyes legyen.

Ne feledje, hogy a 96 dpi általában elég közel van a pontossághoz. A nem vetített képernyőkön a modern pixelek általában körülbelül 0,25 mm-esek, adok vagy vesznek, így általában körülbelül 100 fizikai pixel hüvelykenként, adj vagy veszel, ha a monitor a megfelelőre van állítva. natív felbontás. (Természetesen ez egy hatalmas általánosítás, és nem vonatkozik minden monitorra. Az Eee PC-k például körülbelül 0,19 mm-es pixelekkel rendelkeznek, ha jól emlékszem a specifikációkra.)

07.01.2009

2

elnézést, ehhez az információért a P/Invoke-hoz kell fordulnia.

Íme a link, amelyet egy ideje használtam hozzá: http://www.davidthielen.info/programming/2007/05/get_screen_dpi_.html

07.01.2009
  • Ez úgy tűnik, hogy csak azt kapja meg, amilyenre az ablakok dpi-t állítanak be, ami általában 96 dpi lesz, függetlenül a képernyő méretétől és felbontásától. 08.01.2009
  • Ez az, amit a Graphics példányban fog visszaadni (lásd a P Daddy választ). Nincs szükség P/Invoke-ra. 12.01.2009

  • 3

    Ezt úgy ellenőrizheti, hogy manuálisan kiszámolja a képernyő méretét

    cos(45)*LCD_SCREEN_DIAGONAL_IN_INCHES/sqrt(HORZ_RES^2 + VERT_RES^2)
    

    Ez megadná a pixelszélességet hüvelykben

    07.01.2009
  • Azt hiszem, a kérdés az, hogyan lehet programozottan lekérni az LCD_SCREEN_DIAGONAL_IN_INCHES-t 08.01.2009
  • innen ered az ellenőrzés szó, azt kérte, hogy miként ellenőrizheti, miután megkapta a dpi-t 08.01.2009

  • 4

    A GetDeviceCaps P/Invoke-ozható szerezz néhány számot, de soha nem tudtam, hogy ennyire megbízhatóak lennének...

    07.01.2009

    5

    A kijelző fizikai méreteit a rendszerleíró adatbázisban tárolt EDID információk segítségével szerezheti meg. A megfelelő monitor rendszerleíró kulcsát az EnumDisplayDevices windows API-hívás segítségével szerezheti be.

    A képernyőobjektum fizikai méretei :

    08.09.2010

    6

    TL;DR

    A WPF valódi mérete = pixel * DPI nagyítás

    DPI nagyítás:

    Matrix dpiMagnification
    = PresentationSource.FromVisual(MyUserControl).CompositionTarget.TransformToDevice;
    double magnificationX = dpiMagnification.M11;
    double magnificationY = dpiMagnification.M22;
    

    Vita

    Még 2020-ban is gondjaim voltak ennek a kérdésnek a megoldásával. Amikor 2009-ben feltették/válaszolták ezt a kérdést, a .NET C# valószínűleg a Windows Forms-ot jelentette. De a WPF a mai de facto etalon...

    A "valódi méret" kérdésével valószínűleg már rájött, hogy az operációs rendszer a tényleges pixelekkel (mondjuk 1366x768-mal, amiről tudomásom szerint a szokásos laptopfelbontások) és a DPI-vel (nehéz megtalálni) végez számításokat, hogy megadja a vezérlés valódi értékét. méret. És olyan alkalmazást próbál létrehozni, amely különböző monitorokra skálázható.

    Ez a tényleges DPI-szám rejtettnek tűnik, de normalizálták (százalékra konvertálták). Tegyük fel, hogy 100% = 96 DPI, csak azért, mert a tényleges szám már nem számít. Az emberek egyszerűen növelhetik a rendszerszintű szövegméretet, ha a Windows 10 rendszeren az Asztal elemet választják, majd jobb gombbal kattintanak > Megjelenítési beállítások > Méretezés és elrendezés szakasz > módosítják a szöveg és egyéb elemek nagyításának százalékos arányát.

    Windows10_RightClickDesktop

    Windows10_DisplaySettings_150PercentMagnification_3840x2160

    A pixeleket más módon is megkeresheti, és a pixelt többszörözheti/oszthatja a DPI-százalékkal, hogy megkapja a valódi méretet. Például egy UserControl-t szeretnék egy WPF-ablak vászoneleme köré húzni az egérrel. A felhasználói vezérlő pixelszámát és az egér xy-koordinátáit kikapcsolta a normalizált DPI. Annak érdekében, hogy az egér a felhasználói vezérlővel azonos sebességgel mozogjon, a következőket használom:

    double newXCoord = System.Windows.Forms.Cursor.Position.X;
    double newYCoord = System.Windows.Forms.Cursor.Position.Y;
    double deltaX = newXCoord - oldXCoord;
    double deltaY = newYCoord - oldYCoord;
    
    double magnificationX = 1;
    double magnificationY = 1;
    Matrix dpiMagnification
    = PresentationSource.FromVisual(visual).CompositionTarget.TransformToDevice;
    if (magnificationMatrix != null)
    {
        magnificationX = dpiMagnification.M11;
        magnificationY = dpiMagnification.M22;
    }
    PixelsFromLeft += deltaX / m_magnificationX;
    PixelsFromTop += deltaY / m_magnificationY;
    
    29.03.2020
    Új anyagok

    A rádiógomb ellenőrzött eseményének használata a jQueryben
    Ebben a cikkben látni fogjuk, hogyan kell dolgozni a jquery választógombbal ellenőrzött eseményeivel. A választógombok HTML gombok, amelyek segítenek kiválasztani egyetlen értéket egy csoportból...

    Körkörös függőségek megoldása terraformban adatforrásokkal – lépésről lépésre
    Mi az a körkörös függőségek Dolgozzunk egy egyszerű eseten, amikor az SQS-sor és az S3-vödör közötti körkörös függőség problémája van egy egymástól függő címkeérték miatt. provider..

    Miért érdemes elkezdeni a kódolást 2023-ban?
    01100011 01101111 01100100 01100101 — beep boop beep boop Világunk folyamatosan fejlődik a technológia körül, és naponta fejlesztenek új technológiákat a valós problémák megoldására. Amint..

    🎙 Random Noise #2  – Örökbefogadás és hit
    az analitika íratlan világának gondozása Szeretné, hogy ezek a frissítések a postaládájába kerüljenek? Iratkozzon fel itt . "Ha önvezető autókat gyártanak, akkor mi miért ne..

    A legrosszabb politika és prediktív modellek májátültetésre jelöltek számára az Egyesült Államokban
    A máj (vagy óangolul lifer) az emberi test legnehezebb belső szervére utal, amely csendesen működik a nap 24 órájában. Mit csinál a máj? 500 feladatot hajt végre a szervezet egészségének..

    5 webhely, amely 2022-ben fejleszti front-end fejlesztői készségeit
    Frontendmentor.io A tényleges projektek létrehozásával a Frontendmentor.io segítséget nyújt a front-end kódolási képességeinek fejlesztésében. A kódolást azután kezdheti meg, hogy..

    Mikor kell használni a Type-t az interfészhez képest a TypeScriptben?
    A TypeScript a JavaScript gépelt szuperkészlete, amely statikus gépelést ad a nyelvhez. Ez megkönnyíti a robusztus és karbantartható kód írását azáltal, hogy a hibákat a fordítási időben..