PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : C# VS2005, .NET2.0 Bitmap-Frage


moeb1us
2007-03-16, 18:58:06
habe folgendes problem:
es geht um das verständnis des zusammenhangs bitmap-pixel, size desselbigen und maus-koordinaten. genauer: farberkennung des pixels unter der maus.

zu testzwecken eine simple windows-applikation, standard form von mir aus 500x500 format. ein paar textboxes, unten eine picturebox.
Hab in PS eine bmp erstellt mit 1pixel breiten roten linien auf weissem grund, die bilden ein kreuz, vertikale bei x=58px die horizontale bei y=72px.
über
g.DrawImage(testBitmap, 0,0);
füge ich die bmp in den paint-event der picturebox ein und lese paar parameter aus wie Height/Width, PixelFormat, HorizontalResolution, VerticalResolution usw

im Mousemove-Event der Box schreib ich mit
e.X.ToString()
(entsprechend Y) die aktuellen Koordinaten der Maus in zwei weitere Textboxen. (Die Koordinaten beziehen sich dann auf die Box) Außerdem weise ich mit GetPixel die Mauskoordinatenfarbe als BackColor einer kleinen Textbox zu.

Die Auflösung in PS betrug 72dpi (iirc bedeutet das, 1inch hat 72 horizontale und 72 vertikale pixel). Bei unveränderter Auflösung ist nach Starten der Form auf einem TFT direkt zu erkennen, dass das Bild geblurred ist, und zwar geweitet. Die Mauskoordinaten passen nicht zu den Pixeln, leicht zu verifizieren an den bekannten Positionen der roten Linien.
Erst nach Rumspielen per
.SetResolution()
bekomme ich raus, dass bei einer Auflösung von 96x96 dpi eine Übereinstimmung herrscht, die Koordinaten passen und das Bild wird klar.

Nun meine Frage, ist der Wert immer so, hätte ich das wissen müssen, wenn ja woher und warum ist das so :)
Ist der Wert auf jeder Maschine mit jedem Monitor in jeder Auflösung anders, bzw. was ist die Mechanik dahinter?

Danke im Voraus.
mfg, moe

Xmas
2007-03-16, 20:38:10
Graphics.DpiX bzw DpiY gibt dir die Auflösung des Graphics-Objekts. Wenn du DrawImage nur einen Punkt mitgibst, nimmt es an das du das Image in tatsächlicher Größe darstellen willst. Willst du stattdessen Pixel für Pixel, kannst du noch die Größe angeben:
g.DrawImage(testBitmap, 0, 0, testBitmap.Width, testBitmap.Height) sollte passen.

moeb1us
2007-03-16, 23:44:46
danke, genau die information fehlte, jetzt durchschaue ich es :)
hätte mir dann die parameterliste doch etwas genauer ansehen sollen, hust.


mfg, moe