Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Birne
Thema: [gelöst] DrawImage, kopierter Bereich verpixelt bzw. zu klein
Am im Forum: Grafik und Sound

Hallo Community,

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

Thema: Graphics auf Hintergrund zeichnen ohne Spur
Am im Forum: Grafik und Sound

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.

Im Konstruktor deines Panels:


            //Double Buffer
            this.SetStyle(
               ControlStyles.AllPaintingInWmPaint |
               ControlStyles.UserPaint |
               ControlStyles.OptimizedDoubleBuffer,
               true
               );

Thema: [gelöst] Maus in spezifischer Region, bzw auf geometrischer Figur | "IsVisible Abfrage" ungenau ?
Am im Forum: Grafik und Sound

Habe es nun dank deiner Hilfe mit einigem Gefrikkel hinbekommen =)

Danke für die Hilfe
Thema kann geschlossen bzw als gelöst markiert werden.

Thema: [gelöst] Maus in spezifischer Region, bzw auf geometrischer Figur | "IsVisible Abfrage" ungenau ?
Am im Forum: Grafik und Sound

Wenn ich vorher


            _graphicsPath.Transform(mx);
            _regionPath.Transform(mx);
            _borderRegionPath.Transform(mx);
aufrufe, so dreht sich das Objekt im Falle einer Winkeländerung nicht mehr.

Ansonsten werden alle benötigten Punkte welche ich in eine Array gepackt habe doch vorher gedreht oder nicht

Thema: Mouseover Effekt implementieren
Am im Forum: Grafik und Sound

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.

Thema: [gelöst] Maus in spezifischer Region, bzw auf geometrischer Figur | "IsVisible Abfrage" ungenau ?
Am im Forum: Grafik und Sound

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°.

Thema: [gelöst] Maus in spezifischer Region, bzw auf geometrischer Figur | "IsVisible Abfrage" ungenau ?
Am im Forum: Grafik und Sound

Hallo Allerseits.
Ich habe ein Problem mit der Abfrage ob sich die Maus ain einer Region, bzw. auf einer Geomtetrischen Figur befindet.

Bisher frage ich wie folgt ab:

        private void MapControlRectangle_MouseDown(object sender, MouseEventArgs e)
        {
            if (_borderRegionPath.IsVisible(new Point(e.Y, e.X)))
            {
                _readyForAction = true;
                this.Region = new Region(_borderRegionPath);
            }
            _startPosition = this.PointToScreen(e.Location);
            _startLocation = this.Location;
        }

Drehe ich nun aber die Figur mittels einer Matrix, so ist es schier unmöglich noch einmal die BorderRegion zu treffen.

Nach diversen klicken in und um(!) die eigentliche region schafft man es dann aber irgendwann einmal. Allerdings sehr unzufriedenstellend.

Weiss jemand Rat ?
Gruß und Danke schonmal
Birne