Wenn dies Ihr erster Besuch hier ist,
lesen Sie bitte zuerst die Hilfe - Häufig gestellte Fragen
durch. Sie müssen sich vermutlich registrieren,
bevor Sie Beiträge verfassen können. Klicken Sie oben auf 'Registrieren', um den Registrierungsprozess zu
starten. Sie können auch jetzt schon Beiträge lesen. Suchen Sie sich einfach das Forum aus, das Sie am meisten
interessiert.
Wie groß ein Pixel ist kommt sehr auf das Aufgabegerät an.
<p>
Bei einen Bildschirm lässt sich es softwaretechnisch unmöglich herausfinden, wieviele Pixel 1 cm sind, auf einen Drucker hat man gute Chancen. Wofür brauchst du daß genau
ich programmiere ein rechenheft für einen behinderten jungen.<br>
wenn die mathelehrerin sagt, er soll ein quadrat zeichen mit 4cm<br>
so mussen die 4 cm umgerechnet werden für meine zeichenfunktion rectangle vom canvas!
procedure InitFactors;
var
DC: hDC;
begin
DC := GetDC(0);
try
// Logische Pixel per Inch umwandeln in Millimeter per Pixel
FactorX := GetDeviceCaps(DC, LOGPIXELSX) / 25.4; // 1 Inch = 25.4 mm
FactorY := GetDeviceCaps(DC, LOGPIXELSY) / 25.4;
// oder Pixel und Millimeter Auflösung des Bildschirmes nutzen
FactorX := GetDeviceCaps(DC, HORZRES) / GetDeviceCaps(DC, HORZSIZE);
FactorY := GetDeviceCaps(DC, VERTRES) / GetDeviceCaps(DC, VERTSIZE);
finally
ReleaseDC(0, DC);
end;
end;
function MMtoPixelX(I: Double): Integer;
begin
if FactorX = 0 then InitFactors;
Result := Round(I * FactorX);
end;
function MMtoPixelY(I: Double): Integer;
begin
if FactorY = 0 then InitFactors;
Result := Round(I * FactorY);
end;
Das Problem ist<br>
96 = DPI-Zahl vom Bildschirm<br>
Das ist die DPI-Zahl die mit "grosse Schriften" / "kleine Schriften" veraendert werden kann.<br>
Dier Wert muss also nichts mit der Realitaet zu tun haben.<br>
Das ist wohl einer der schlimmsten Bugs von Windows
Yes, und deshalb benutzt der Code als zweite Alternative eben das Verhältniss von der Milimeter Auflösunf zur Pixelauflösung des Bildschirmes. Ein anderer Grund ist das eben unsere Monitor NICHT Quadratisch sind sondern Rechteckig. Somit ist die Pixel Auflösung der X und Y Achsen verschieden. Ein 100x100 Pixel Quadrat wird eben NICHT als Quadrat dargestellt sondern als Rechteck mit unterschiedlichen kantenlängen.
@Markus, Deine Methode ist also ein zu naiver Ansatz, sorry
Also, die globalen variablen FactorX und FactorY müssen einmal initialisiert werden. Das mach InitFactors. Der Wert in FactorX ist die Anzahl der Pixel pro Millimeter in der X Achse, FactorY Anzahl der Pixel pro Millimeter in der Y Achse. heist also A(Pixel) := B(mm) * FactorX würde B Millimeter in A Pixel umrechnen. Wenn das der fall ist dann muß B(mm) := A(pixel) / FactorX die Umrechnung von Pixel aus Millimeter sein.
....obwohl so und so eine nicht maßstabs-getreue Zeichnung auf dem Bildschirm herauskommt. Da z.B. jeder User seine Bildschirmbild direkt in allen Richtungen verzerren kann, bekommt man nie eine (genaue) maßstabsgetreue Zeichnung herbekommen, es sei denn man lässt den Benutzer auf irgendeine Weise die Größe eines Bildpunktes in cm eingeben
Die Sache ist rel. simpel. Obiger Code ermittelt ja die Bildschirmgröße in Millimeter. Sollte der Monitor korrekt ausgewählt sein dann stimmen die Maße auch. Ansonsten zeichnet man einfach ein 5x5cm Rechteck und lässt den user mit einem Lineal nachmessen. Das gemessene Ratio zum berechneten ergibt dann das Differenz-Ratio das nun abgespeichert werden kann. Jede Umwandlung nutzt nun dieses Ratio. Damit lassen sich erstaunliche Genauigkeiten erzeugen. In einem kleineren Projekt von mir bin ich genau so vorgegangen, und man konnte tatsächlich die genauen Maße der Geometrischen Figuren 1 zu 1 vom Monitor abnehmen.
naja, die meisten Plastiklineale haben gut funktioniert. Die Anforderung war eben das viele verschiedene Figuren sehr schnell berechnet wurden. Jedesmal erst einen Ausdruck auf'm Plotter zu machen war zu ineffizient
Comment