c # - Hvordan bestemmer jeg min skærms sande pixelstørrelse i .NET?

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg ønsker at vise et billede på 'ægte størrelse' i min ansøgning. For det skal jeg vide pixelstørrelsen på skærmen.


Jeg ved, at Windows-skærmopløsning er nominelt 96dpi, men for mit formål vil jeg have et bedre gæt. Jeg forstår, at disse oplysninger måske ikke altid er tilgængelige eller nøjagtige (f.eks. Ældre CRT-skærme), men jeg forestiller mig, at LCD-skærmen forventer, at dette bør være muligt!


Er der mulighed for at få pixelstørrelsen på min skærm?


Er der en måde at afgøre, om pixelstørrelsen er nøjagtig?


.NET API er foretrukket (jeg kunne ikke finde dem), men Win32 er også ok, jeg er glad for at P/Invoke.

Bedste reference


For displaystørrelsen vil du have Screen .PrimaryScreen.Bounds.Size (eller Screen.GetBounds(myform)). [7]


Hvis du vil have DPI'en, skal du bruge DpiX- og DpiY-egenskaberne for grafik: [8] [9] [10]


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





Oh vent! Du ønskede faktisk, hold en linjal op til skærmen og måle, størrelse ?! Nej. Det er ikke muligt at bruge nogen OS-tjenester. OS'et kender ikke de faktiske dimensioner af skærmen, eller hvordan brugeren har kalibreret. Nogle af disse oplysninger er teoretisk detekterbare, men det er ikke deterministisk nok til, at operativsystemet kan bruge det pålideligt, så det gør det ikke.


Som et arbejde kan du prøve et par ting.



  • Du kan forsøge at forespørge skærmens streng på den installerede skærm enhed (jeg er ikke sikker på, hvordan du gør det) og se om du kan analysere en fornuftig størrelse ud af det. For eksempel kan skærmen være en ' ValueBin E17p ', og du kan udlede, at det er' 17 '-skærm fra det. Selvfølgelig er denne skærmstreng sandsynligvis' Plug and Play Monitor '. Denne skema er i bedste fald sketchy.

  • Du kan spørge brugeren, hvilken størrelse skærm de har. Måske de ved.



Når du ved (eller tænk du ved) skærmens diagonale størrelse, skal du finde det fysiske aspektforhold. Igen er et par ting:



  • Antag, at det nuværende pixelformatforhold svarer til monitorens fysiske billedformat. Dette antager, at (A) brugeren har valgt en opløsning, der er ideel til deres skærm, og at (B) skærmen har kvadratpixel. Jeg kender ikke til en nuværende forbrugerorienteret computerskærm, der ikke har kvadratpixel, men ældre og nyere.
  • Spørg brugeren. Måske de ved.



Når du ved (eller tænk du ved), hvad skærmens diagonale størrelse og fysiske aspektforhold er, så kan du beregne dens fysiske bredde og højde. En 2 + B 2 =C 2 , så nogle beregninger vil give dig det godt:



  Hvis du fandt ud af at det er en 17 'skærm, og dens nuværende opløsning er 1280 x 1024:

  1280 2 + 1024 2 =2686976

  Sqrt (2686976)=1639.1998047828092637409837247032

  17 '* 1280/1639.2=13.274768179599804782820888238165'

  17 '* 1024/1639,2=10,619814543679843826256710590532'



Dette sætter den fysiske bredde på 13,27 'og den fysiske højde på 10,62'. Dette gør pixlerne 13,27 '/1280=10,62'/1024=0,01037 'eller ca. 0,233 mm.


Selvfølgelig er alt dette ugyldigt, hvis brugeren ikke har en passende opløsning, skærmen har skøre, ikke-kvadratiske pixels, eller det er en ældre analog skærm og kontrollerne er ikke justeret korrekt for displayet for at fylde hele fysiske skærmen. Eller værre, det kunne være en projektor.


I sidste ende er det måske bedst at udføre et kalibreringstrin, hvor du har brugeren rent faktisk holde en linjal op til skærmen og måle størrelsen på noget til dig. Du kunne:



  • Har brugeren klik på musen på to punkter en tomme (eller en centimeter) fra hinanden.

  • Tegn en boks på skærmen og få brugeren til at trykke på op- og nedpilene for at justere dens højde og venstre og højre pilene for at justere bredden, indtil kassen er nøjagtig en tomme (eller centimeter) firkantet i henhold til deres lineal.

  • Tegn en boks på skærmen og få brugeren til at fortælle, hvor mange tommer/centimeter det er i hver dimension.



Uanset hvad du gør , skal du ikke forvente, at dine resultater er 100\% korrekte. Der er alt for mange faktorer til spil for dig (eller brugeren) for at få det præcis korrekt, hver gang.


Vær opmærksom på, at 96 dpi er normalt temmelig tæt til præcis. Moderne pixels på ikke-projicerede skærme har alle tendens til at være ca. 0,25 mm, giver eller tager, så du normalt slutter med omkring 100 fysiske pixels pr. Tommer, giver eller tager, hvis skærmen er indstillet til dens native opløsning. (Selvfølgelig er dette en enorm generalisering og ikke gælder for alle skærme. Eee-pc'er har for eksempel pixler på omkring 0,19 mm, hvis jeg husker specifikationerne korrekt.)

Andre referencer 1


Undskyld, du skal P/Invoke for disse oplysninger.


Her er det link, jeg brugte for det for et stykke tid siden:
http://www.davidthielen.info/programming/2007/05/get\_screen\_dpi\_.html[11]

Andre referencer 2


Du kan tjekke ved kun at beregne manuelt fra din skærmstørrelse


cos(45)*LCD\_SCREEN\_DIAGONAL\_IN\_INCHES/sqrt(HORZ\_RES^2 + VERT\_RES^2)


Det ville give dig pixelbredden i inches

Andre referencer 3


GetDeviceCaps kan være P/Invoke 'd for at få nogle tal, men jeg har aldrig kendt tallene for at være så troværdige ... [12]

Andre referencer 4


Du kan få vist de fysiske dimensioner på displayet ved hjælp af EDID-oplysningerne, der er gemt i registreringsdatabasen. Du kan hente den relevante skærms registreringsnøgle ved hjælp af EnumDisplayDevices windows API-opkaldet.


Fysiske dimensioner til skærmobjektet: [13]