ich habe derweil ein Problem mit der drawImage Methode.
Situation.
Ich habe 2 Bilder.
Aus dem einen Bild will ich einen bestimmten Bereich auf das andere Bild Kopieren. Nun ist der kopierte bereich aber wesentlich kleiner als der Eigentliche.
Angenommen der Ursprüngliche Bereich ist Anfangs 200 x 200 Pixel groß, so ist er nach dem Kopieren und Zeichenen auf dem anderem Bild nur noch vllt. 50 x 50 Pixel groß.
Ursprünglich wollte ich damit eine Zoomfunktion implementieren, aber wie es ausschaut wirkt es eher umgekehrt.
private void button1_Click(object sender, EventArgs e)
{
_RubberBand = new Rectangle(this.ClientSize.Width / 3 + 50, this.ClientSize.Height / 3 + 50, 300, 200);
ControlPaint.DrawReversibleFrame(_RubberBand, this.BackColor, FrameStyle.Dashed);
//Das _RubberBand wird später mittels Mause in der Größe bstimmt
}
private void button2_Click(object sender, EventArgs e)
{
_ZoomRect = this.RectangleToClient(_RubberBand);
bmp_cut = new Bitmap(_ZoomRect.Width, _ZoomRect.Height); // Bitmap in der größe des Auswahlrechteckes (Rubberband) erstellen
Graphics g = Graphics.FromImage(bmp_cut);
image = this.BackgroundImage;
g.DrawImage(image, 0,0, _ZoomRect, GraphicsUnit.Pixel); // bmp_cut mit dem "Bild des Auswahlrechteckes" bemalern
Graphics a = this.CreateGraphics();
a.DrawImageUnscaled(bmp_cut, 0,0); // Bild anzeigen
g.Dispose();
a.Dispose();
}
Weiß jemand warum der kopierte Bereich so klein ist oder hat gar jemand eine Lösung für das Problem parat ?
Edit: Bitte nicht von den Buttons irritieren lassen, entsprechen aktuelle nicht dem Sachverhalt. Letzlich erstellt der Button1 testweise das "RubberBand"
und Button2 (Zoom) zeichnet das Bild unskaliert.
Danke
Birne
Letzlich lohnt sich ein Blick in Herbivores Links.
Wenn du wirklich flackerfrei zeichnen willst, dann solltest du, jegliches Zeichnen dem Panel überlassen, das heisst, das Auto sollte kein Control mit Transparenz effekten sein welches du über das Panel bewegst.
Sollte das Auto ne Spur hinterlassen dann invalidierst du nach einer Positionsänderung des Autos das Panel nicht.
Nachdem sdu das auto also bewegt hast -> Invalidate();
Wichtig ist auch, das du jegliches Zeichnen in die OnPaint Methode verlagerst.
Gegen Flackerei hilft in der Regel DoubleBuffering.
Wenn du das Auto wie beschrieben zeichnest, kannst du das bereits vorhandene Buffering nutzen.
Reicht es nicht einmal das Bild aus der Datei zu laden ?
In jedem Aufruf von OnPaint erstellst du ein neues Bild.
Möglicherweise füllst du damit den Speicher und es kommt zur angesprochenen Exception.
Zunächst einmal danke für die Antwort.
Leider führt dieses nicht zum Erfolg, mag aber auch an meiner Ausführung liegen :\
Newbe ...
(Was nicht heissen soll dass ich mir noch keine lehrende Lektüre zu Gemüte geführt habe !)
mx.RotateAt(_angel, new Point(this.ClientSize.Width / 2, this.ClientSize.Height / 2), MatrixOrder.Append);
// mx ist die Matrix
Point ptPosition = new Point();
ptPosition.X = x;
ptPosition.Y = y;
Point ptSize = new Point();
ptSize.X = width;
ptSize.Y = height;
Point[] array = new Point[] { ptPosition, ptSize };
mx.TransformPoints(array);
// Oben
_graphicsPath.AddLine(x + cornerRadius, y, x + width - cornerRadius, y);
_regionPath.AddLine(x + cornerRadius - border, y - border, x + width - cornerRadius + border, y - border);
_borderRegionPath.AddLine(x + cornerRadius + halfBorderArea, y + halfBorderArea, x + width - cornerRadius - halfBorderArea, y + halfBorderArea);
// Ecke rechts oben
_graphicsPath.AddArc(x + width - cornerRadius, y, cornerRadius, cornerRadius, 270, 90);
_regionPath.AddArc(x + width - cornerRadius + border, y - border, cornerRadius, cornerRadius, 270, 90);
_borderRegionPath.AddArc(x + width - cornerRadius - halfBorderArea, y + halfBorderArea, cornerRadius, cornerRadius, 270, 90);
usw. usf.
Schlussendlich dann:
// Die Figur abschließen
_graphicsPath.CloseFigure();
_regionPath.CloseFigure();
_borderRegionPath.CloseFigure();
_graphicsPath.Transform(mx);
_regionPath.Transform(mx);
_borderRegionPath.Transform(mx);
meine Figur (viereck mit abgerundeten ecken) ist nun zwar etwas deformiert, doch reagiert noch immer nicht korrekt auf die Events.
Der Bereich auf Welchen reagiert wird, scheint nach dem Drehen der Figur, Derselbe zu sein, wie vor dem Drehen, also in einem winkelzustand von 0°.