Entwickler-Ecke
Basistechnologien - Berechnen von Aspect Ratio
Chiyoko - Mi 23.06.10 10:47
Titel: Berechnen von Aspect Ratio
Huhu,
Ich wuerde gerne ohne die vorgefertigten Klassen ein Bild mit Aspect ratio auf die Form verkleinern.(Zoom)
ich habe zwar viel im Net gefunden aber daraus werd ich nicht ganz schlau.
Ein Bild an die Form per Strech anpassen ist kein Problem.
In meinem (3D) Spiel habe ich es immer so gemacht, um z.B. das Menue an die Bildschirmaufloesung anzupassen.
C#-Quelltext
1: 2:
| Bild.pos_x = (screen_size.x - bild_width ) / 2; Bild.pos_y = (screen_size.y - bild_height ) / 2; |
Das kann ich natuerlich schlecht anwenden^^
Hat vielleicht jemand einen Rat fuer mich?
Danke.
Th69 - Mi 23.06.10 11:55
Du mußt dir das Minimum der beiden Faktoren heraussuchen und dann je Dimension zentrieren:
C#-Quelltext
1: 2: 3: 4: 5: 6:
| double fx = (double)x / X; double fy = (double)y / y; double f = Math.Min(fx, fy);
pos_x = (X - x) * f; pos_y = (Y - y) * f; |
d.h. analog zu deiner bisherigen Zentrier-Formel (nur daß statt /2 der Faktor hier dann 0.5 wäre).
Chiyoko - Mi 23.06.10 12:47
Danke, das hilft mir denk ich ganz gut weiter.
Ich versuch mich mal dran:)
Chiyoko - Di 29.06.10 12:30
Der Code abschnitt ist zwar nicht von mir, tut aber genau das, was ich brauche.
Vielleicht bekomm ich es ja noch besser hin.
C#-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22: 23: 24: 25: 26: 27: 28: 29: 30: 31: 32: 33: 34: 35: 36: 37: 38: 39: 40: 41: 42: 43: 44: 45:
| using System.Drawing;
namespace Uhr_app { public partial class Form1 { private Point Center( Size size ) { int x = this.ClientRectangle.Width / 2 - size.Width / 2; int y = this.ClientRectangle.Height / 2 - size.Height / 2; return new Point ( x , y ); } private Size AspectRatio() { float nPercent = 0; float nPercentW = 0; float nPercentH = 0;
int nSourceWidth = this.BackgroundImage.Width; int nSourceHeight = this.BackgroundImage.Height;
nPercentW = ( ( float ) Width / ( float ) nSourceWidth ); nPercentH = ( ( float ) Height / ( float ) nSourceHeight ); int nDestinationX = 0; int nDestinationY = 0; if ( nPercentH < nPercentW ) { nPercent = nPercentH; nDestinationX = System.Convert.ToInt16 ( ( Width - ( nSourceWidth * nPercent ) ) / 2 ); } else { nPercent = nPercentW; nDestinationY = System.Convert.ToInt16 ( ( Height - ( nSourceHeight * nPercent ) ) / 2 ); }
int nDestinationWidth = ( int ) ( nSourceWidth * nPercent ); int nDestinationHeight = ( int ) ( nSourceHeight * nPercent ); return new Size ( nDestinationWidth , nDestinationHeight ); } } } |
Sobald dann das Bild gewaehlt wurde, setzt man die Werte und zeichnet das Bild neu.
C#-Quelltext
1: 2: 3:
| Size sizeAspectRatio = AspectRatio (); Point ptCenterZoom = Center ( sizeAspectRatio ); g.DrawImage ( this.BackgroundImage , ptCenterZoom.X , ptCenterZoom.Y , sizeAspectRatio.Width , sizeAspectRatio.Height ); |
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2025 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!