Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi zentimetergenaues Zeichnen auf Monitor unmöglich? (https://www.delphipraxis.net/113395-zentimetergenaues-zeichnen-auf-monitor-unmoeglich.html)

taaktaak 7. Mai 2008 09:57


zentimetergenaues Zeichnen auf Monitor unmöglich?
 
Moin, Moin.
Ich möchte auf einem Canvas (Monitor) Linien im exakten Horizontalabstand von 1cm zeichnen. Nix leichter als das - dachte ich. Dafür gibt's ja Funktionen, die dich die Anzahl der Pixel je Zentimeter berechnen lassen. Meine bisherigen Versuche scheitern aber dummerweise kläglich :x

Delphi-Quellcode:
procedure GetHorPixelsPerCM;
var DC          : HDC;
    HorPixCM_v1,
    HorPixCM_v2  : Integer;
begin
  DC:=GetDC(0);

  HorPixCM_v1:=Trunc(GetDeviceCaps(DC,LOGPIXELSX)/2.54);
  ShowMessage('pixel/cm'#13'Variante mit LogPixelsX'#13
              +IntToStr(HorPixCM_v1));

  HorPixCM_v2:=MulDiv(GetDeviceCaps(DC,HorzRes),10,GetDeviceCaps(DC,HorzSize));
  ShowMessage('pixel/cm'#13'Variante mit HorzRes+HorzSize'#13
              +IntToStr(HorPixCM_v2));

  ShowMessage('pixel/cm'#13'Variante mit Screen.PixelsPerInch (nur vertikal gültig)'#13
              +IntToStr(Trunc(Screen.PixelsPerInch/2.54)));

  ReleaseDC(0,DC);
end;
Die beiden ersten Varianten liefern z.B. auf meinem Notebook abweichende Angaben von 37 bzw. 35 Pixel/cm. Die dritte Variante (die lt. Delphihilfe für horizontale Auflösungen nicht verwendet werden sollte) liefert wieder ein Ergebnis von 37 Pixel/cm. Korrekt sind die Werte allerdings in keinem Fall - richtig wären 34 Pixel/cm. Für alle mir zugänglichen PC-Monitore werden ebenfalls falsche Ergebnisse ermittelt. Ursachenforschung ist bei der Variante 1 möglich: Der Wert für HorzSize (also die horizontale Breite in mm) wird in allen untersuchten Fällen falsch zurückgeliefert.

Fragen:
  • Ist meine Herangehensweise falsch?
  • Falls es mal einer der Leser nachprüfen möchte, finden sich Monitorkonfigurationen bei denen das Ergebnis korrekt ermittelt wird?
  • Gibt es eine alternative Lösung? Im Augenblick fällt mir nur eine Konfigurationsmöglichkeit ein, anhand derer der Anwender eine Kalibrierung vornehmen kann und das Programm dann mit einem zusätzlichen Korrekturfaktor arbeitet.

shmia 7. Mai 2008 10:04

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?
 
Zitat:

Zitat von taaktaak
Ist meine Herangehensweise falsch?

Ja, wenn du mit Pixel/Inch als Integerwert rechnest, werden immer Rundungsfehler auftreten.
Also wenn's 100% stimmen soll, dann muss der Benutzer die Breite und Höhe seines Monitor in Millimeter eingeben.
Die Auflösung kann du ja abfragen (Screen.Width, Screen.Height) und damit die Pixel/mm als Fliesskommazahl errechnen.

Corpsman 7. Mai 2008 10:10

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?
 
Bei mir war die Ausgabe

37
34
37


Ich habs nachgemessen

und 34 stimmt

folglich sind die 37 Werte Falsch ;)

getestet an einer GForce 8800GTS mit DualMonitorsystem ( Jeweils 19", 1280 x 1024 )

Ich mach das übrigens immer so das das ich mir vom User die Abmase ( meist da ich das ja nur beim Drucken brauche sind die schon bekannt ) geben lasse und rechne das dan mittels dreisatz von hand aus.

Solltest du das wirklich für Monitorausgabe benötigen ist das natürlich nicht mehr so praktisch ..

Vorallem da du ja die Auflösung beliebig ändern kannst.

SirThornberry 7. Mai 2008 10:16

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?
 
Es gibt nur beim Monitor nur die Variante den Benutzer die Breite eingeben zu lassen. Alles andere ist ungenau. Denn wenn jemand einen Röhrenmonitor hat kann er das Bild breiter, schmaler, höher etc. machen. Und diese Werte kannst du nunmal nicht auslesen.

Luckie 7. Mai 2008 10:40

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?
 
Kann auch den MapeMode mit MSDN-Library durchsuchenSetMapMode auf Millimeter umstellen.

SirThornberry 7. Mai 2008 10:49

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?
 
was aber auch keine große Genautigkeit hat da dies nicht berücksichtigt wie man das Bild per Monitor gezerrt hat.

rotfc 7. Mai 2008 11:24

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?
 
Das geht nur, wenn die Bildschirmauflösung und die physikalische Höhe/Breite eines Pixels bereits vorher bekannt sind. Wobei ein "programmiertes Pixel" nichts mit der physischen Darstellung des Pixels auf dem Monitor zu tun hat.

Stell mal bei einem 17"-Monitor 640x480 ein. Dann kannst Du wieder von vorne anfangen ;-(

taaktaak 7. Mai 2008 16:34

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Zunächst einmal Danke für die Hinweise und Anregungen!

Um das Thema für mich und andere die das vielleicht noch einmal lesen abzuschließen, hier eine kleine Zusammenzufassung:
  • Wie shmia zu Recht bemerkt, ist es ein recht grober Schnitzer, sofort zu Runden und mit Integern zu arbeiten. Natürlich führt das zu einem unnötigen Abweichungsfehler. Allerdings führt die exaktere Werteführung bei meiner Gerätekonfiguration zu einer noch größeren Abweichung vom Soll-Maß.
  • Die Verwendung von "LogPixelsX" und "Screen.PixelsPerInch" führt in jedem Fall zu den größten Abweichungen und ist daher grundsätzlich nicht die richtige Wahl.
  • Werden "HorzRes" und "HorzSize" verwendet, ist das Ergebnis recht genau. Im Falle von Corpsman sogar exakt passend. Aber verlassen kann man sich augenscheinlich nicht darauf.
  • Die von Luckie vorgeschlagene Verwendung von SetMapMode hat (in meinem Fall) die gleiche Genauigkeit wie "HorzRes" und "HorzSize". Es kann also im konkreten Einzelfall alternativ verwendet werden.
  • Ist eine absolute Genauigkeit erforderlich, bleibt, wie von mehreren angemerkt und von mir bereits vermutet, nur die Kalibrierung auf den verwendeten Monitor und interen Verwendung eines Kalibrierungsfaktors für alle Zeichenoperationen.
Wer die verschiedenen Möglichkeiten auf seinem Monitor ausprobieren möchte, kann das angehängte Mini-Programm verwenden (nur Source) :hi:

thomas2009 5. Feb 2009 10:13

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Was meinst Du mit "Die Balken haben immer 5 cm Breite" ?

Teekeks 5. Feb 2009 10:22

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?
 
Ich denke mal das die Balken immer exakt 5cm breit seien sollten.
Laut der eingesetzten Funktionen jedenfals...

taaktaak 5. Feb 2009 10:23

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?
 
Lustig, hatte gerade auf diesen Thread verwiesen!

Ja, also, die roten Balken sollen immer exakt 5 cm lang/breit sein, die Darstellungslänge ist also auf dem Bildschirm mit einem Maßstab zu überprüfen

thomas2009 5. Feb 2009 11:05

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?
 
Liste der Anhänge anzeigen (Anzahl: 1)
Bei mir sind die Balken zwischen 5,8 bis 6.1 !!!

himitsu 5. Feb 2009 11:09

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?
 
Was ist'n das für ein Monitor?
Bei TFTs sind die Pixel ja noch relativ gleichmäßig verteilt.
Bei 'nem Röhrenmonitor, Beamer und o. kann das Bild in sich verzerrt sein ... also an der einen Stelle sind 5 Pixel pro Millimeter und an 'ner anderen Stelle vielleicht 8.

thomas2009 5. Feb 2009 11:15

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?
 
Zitat:

Zitat von himitsu
Was ist'n das für ein Monitor?
Bei TFTs sind die Pixel ja noch relativ gleichmäßig verteilt.
Bei 'nem Röhrenmonitor, Beamer und o. kann das Bild in sich verzerrt sein ... also an der einen Stelle sind 5 Pixel pro Millimeter und an 'ner anderen Stelle vielleicht 8.

Ja ich habe TFT Bildschirm
Wenn ich eine neue Blatt mit Photoshop in mm erstellen möchte, fragt mich Photoshop nicht über meinen Monitor :mrgreen:
Beim Ausdrucken bekomme ich genau was ich eingegeben habe.

Oder ist das nur auf Bildschirm ?
Ich werde das ausdrucken und schaue ich was rauskommt :gruebel:

taaktaak 5. Feb 2009 11:27

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?
 
Ja, dies ist primär eine Monitor-Problematik

himitsu 5. Feb 2009 11:52

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?
 
Zitat:

Zitat von thomas2009
Wenn ich eine neue Blatt mit Photoshop in mm erstellen möchte, fragt mich Photoshop nicht über meinen Monitor :mrgreen:
Beim Ausdrucken bekommt ich genau was ich eingegeben habe.

Ja was hat denn der Monitor mit dem Drucker zu tun?

mr_emre_d 5. Feb 2009 12:28

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?
 
Wikipedia hilft

Code:
...Seitenverhältnis (englisch pixel aspect ratio) eines Pixels auf dem Bildschirm muss nicht zwingend 1 sein. Das bedeutet, dass die Darstellung eines Pixels nicht immer quadratisch ist. Die Pixelgröße sowie der Pixelabstand im Verhältnis zur Bildauflösung haben...
[ http://de.wikipedia.org/wiki/Pixel ]

Reinhard Kern 5. Feb 2009 13:13

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?
 
Zitat:

Zitat von taaktaak
Ja, dies ist primär eine Monitor-Problematik

Hallo,

das ist eine Problematik aller Ausgabegeräte, besonders auch Plotter und Drucker. Einen präzisen Ausdruck brauche ich viel öfter als eine entsprechende Monitor-Darstellung, z.B. wenn ich ein Schild drucken und nach dem Umriss genau zuschneiden will. Die Angaben, die Windows liefert, sind nur ein grober Anhaltspunkt mit +- 10% Fehler. Wer genauer arbeiten will, muss selbst kalibrieren, und zwar für jedes Gerät getrennt. Das Verfahren ist immer gleich: so was wie ein Lineal drucken und vermessen und danach einen Ausgabefaktor bestimmen.

Manche Treiber und manche Druckfunktionen verfügen über eine Skalierung, aber die ist oft zu grob, bei A3 ist 1% Abweichung schon 4 mm, man müsste also 0.01% eingeben können, was meistens nicht vorgesehen ist. Präzisionsgeräte wie Laserplotter (Elektronik, Zeitschriften) arbeiten mit Genauigkeiten von 5 µ auf 1 m, also 0.0005%.

In die eigene Software einen (genaugenommen 2) Skalierfaktor einzubauen, ist kein Problem, wie in diesem Thread. Problematisch wird es, wenn man eine CAD-Software benutzt und keine vorgesehen ist. Die Abweichungen bei Druckern liegen generell im mm-Bereich.

Gruss Reinhard

WS1976 5. Feb 2009 13:30

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?
 
Hallo,

Zitat:

Denn wenn jemand einen Röhrenmonitor hat kann er das Bild breiter, schmaler, höher etc. machen.
Ich würde mich auf diese Aussage nicht verlassen. Je nach Bildwiederholfrequenz und Auflösung kann sich die Geometrie auch bei einem TFT verändern. Desweiteren gibt es TFTs bei denen sich das Bild in Höhe und Breite ändern lässt.

Fazit:
Das Problem ist höchstwahrscheinlich nur mit Metermaß und entsprechenden Korrekturfaktoren im Programm lösbar. Denke bitte auch an die DPI Einstellung, die man relativ grösszügig verändern kann.

Grüsse
Rainer

thomas2009 5. Feb 2009 19:52

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?
 
Beim Ausdrucken habe ich tatsächlich genau 5 cm erhalten
Also alles in Ordnung : )
d.h. was man aus den Bildschirm messt, entsprecht nicht der Maße

Sir Rufo 6. Feb 2009 01:06

Re: zentimetergenaues Zeichnen auf Monitor unmöglich?
 
Zitat:

Zitat von thomas2009
Wenn ich eine neue Blatt mit Photoshop in mm erstellen möchte, fragt mich Photoshop nicht über meinen Monitor :mrgreen:
Beim Ausdrucken bekomme ich genau was ich eingegeben habe.

Oder ist das nur auf Bildschirm ?
Ich werde das ausdrucken und schaue ich was rauskommt :gruebel:

Aua ... ich hoffe nicht, dass du Architekt von Brücken bist, denn die Materialanforderung bei deinem Chef möchte ich sehen, und dann sein Gesicht:

"WAAAAAAS? Ein 10km breiter und 1km hoher Flachbildschirm?"

Ich glaube das Zauberwort heisst da Zoom ... da werden aus 5cm auch schnell 10km oder sogar 1mm und trotzdem druckt der Drucker 5cm, welch Wunder der modernen Technik.


Alle Zeitangaben in WEZ +1. Es ist jetzt 06:38 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz