Forum: PC-Programmierung C# - Graphic ohne Skalierung in PictureBox zeichnen


von Matt B. (mattb)


Lesenswert?

Hallo Zusammen,

ich moechte eine Bild, das als Graphics in C# vorliegt unskaliert in 
eine Picturebox laden.

Dsa funktioniert. Allerdings wird das Bild skaliert und damit groesser 
angezeigt als ich das will.

Hier der Code dazu:
1
Bitmap bitmap = global::Porsche.Properties.Resources.Bitmap1;
2
Bitmap returnBitmap = new Bitmap(bitmap.Width, bitmap.Height);
3
4
Graphics graphics = Graphics.FromImage(returnBitmap);
5
graphics.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.AntiAlias;
6
graphics.DrawImageUnscaled(bitmap, new Point(0, 0));
7
8
this.pictureBox1.BackgroundImage = returnBitmap;

Ich habe mir nach dem Laden des BackgroundImages schon die Image-Width 
und Height in MessageBoxen anzeigen lassen. Hierbei werden die richtigen 
Werte angezeigt. Aber innerhalb der Picturebox erscheint das Bild 
groesser als es sollte.

BackgroundImageLayout ist auf None!

Hat jemand eine Idee dazu?

Vielen Dank
Matt

von Sharping (Gast)


Lesenswert?

Wie erscheint das Bild denn? Was heißt "größer"?
Ist es genauso groß wie die Picturebox? Oder wird es irgendwie anders 
skaliert?

von raketenfred (Gast)


Lesenswert?

warum nicht die größe der picturebox auf die größe des bildes sezten?

quick'n'dirty ;-)

von Matt B. (mattb)


Angehängte Dateien:

Lesenswert?

Das Originalbild hat eine Groesse von 360 x 104 Pixel. Die PictureBox 
hat genau die gleiche Groesse. Also eigentlich sollte das Bild genau 
rein passen.
Setze ich das BackgroundImage direkt in den Einstellungen, passt das 
auch, aber setze ich es mit dem Code, erscheint es wie in dem 
angehaengtem Bild.

von Sharping (Gast)


Lesenswert?

Darf ich mal fragen, warum du überhaupt mit Graphics Objekten hantierst?
Du könntest doch direkt das Image in das BackgroundImage der PictureBox 
laden? Das macht in deinem Code nicht viel Sinn...

Außerdem: DrawImageUnscaled ist die vollkommen falsche Methode, da diese 
auch physikalische Größen wie die DPI deines Systems einbezieht...

von Matt B. (mattb)


Lesenswert?

Der Hintergrund, warum ich mit einer Graphic arbeite ist, dass ich die 
abgebildete Tachonadel in verschiedene Winkel stellen will. Hierfuer 
habe ich Code im Internet gefunden. Als mir dann das Problem mit der 
Skalierung auffiel, habe ich den Code um das Bild zu drehen vorerst 
wieder geloescht.

Ich habe auch schon die Methode "DrawImage" ausprobiert, aber es ergab 
das gleiche Ergebnis!

von Sven H. (dsb_sven)


Lesenswert?

Ich meine, bei der PictureBox gibt es eine Eigenschaft, die angibt, ob, 
und wenn ja, wie das Bild skaliert werden soll.

von Matt B. (mattb)


Lesenswert?

Meines Wissens ist die BackgroundImageLayout-Eigenschaft genau diese. 
Und diese ist auf None gestellt, also keine Skalierung.

von Sven H. (dsb_sven)


Lesenswert?

Du willst also das Bild als Hintergrundbild in die PictureBox einfügen?

Wenn es keinen guten Grund dafür gibt, nimm doch PictureBox.Image für 
das Bild und PictureBox.SizeMode für die Einstellung der Skalierung?

von Matt B. (mattb)


Lesenswert?

Auch wenn ich das Bild als Image (Anstelle von BackgroundImage) verwende 
bleibt das Ergebnis das Gleiche! Hierbei habe ich auch die 
Unterschiedlichen SizeModes ausprobiert!

von bluppdidupp (Gast)


Lesenswert?

Setz mal graphics.PageUnit=PageUnit.Pixel;

von Matt B. (mattb)


Lesenswert?

Hi bluppdidupp,

hat leider nichts gebracht!
Trotzdem danke!

Gibt es vielleicht einen weg ein Bild zu drehen ohne es in eine Graphics 
umzuwandeln?

von Matt B. (mattb)


Lesenswert?

Ich habe gerade einen aehnlichen Code ausprobiert, den ich im Internet 
gefunden habe 
(http://code-bude.net/2011/07/12/bilder-rotieren-mit-csharp-bitmap-rotateflip-vs-gdi-graphics/).

Mit diesem Code funktioniert die Geschichte wunderbar. Vielleicht kann 
mir jemand erklaeren, an was dies liegt.
Zum Verstaendnis: Hier ist die Drehung gleich mit dabei, nicht nur das 
reine Zeichnen des Bildes
1
Bitmap bitmap = global::Projekt.Properties.Resources.Bitmap1;
2
3
using (Graphics graphics = Graphics.FromImage(bitmap))
4
{
5
   graphics.TranslateTransform((float)bitmap.Width / 2, (float)bitmap.Height / 2);
6
   graphics.RotateTransform(Rpm/(33 + 1/3) - 45.0F);
7
   graphics.TranslateTransform(-(float)bitmap.Width / 2, -(float)bitmap.Height / 2);
8
   graphics.DrawImage(bitmap, new Point(0, 0));
9
}
10
11
this.pictureBox1.Image = bitmap;


Vielen Danke fuer Eure Tipps!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.