Laden...

Zoomen OHNE Anti-Aliasing

Erstellt von peterguy vor 9 Jahren Letzter Beitrag vor 9 Jahren 1.346 Views
P
peterguy Themenstarter:in
23 Beiträge seit 2009
vor 9 Jahren
Zoomen OHNE Anti-Aliasing

Hallo Community,

nach einer längeren Abstinenz habe ich mal wieder ein kleines C# Projekt an dem ich arbeite.
Und zwar soll das Ganze ein Editor für HMIs (GUIs) für eingebettete Systeme werden.

Das Zeichnen der GUI geschieht auf Basis des Tutorials hier:
[Tutorial] Gezeichnete Objekte mit der Maus verschieben

Klappt bisher soweit wunderbar, nur das Zoomen klappt noch nicht wie gewünscht. Im angehängten Screenshot ist der Ausgangszustand zu sehen.
In den nächsten beiden Beiträgen lad ich noch den Ist- und den Soll-Zustand hoch.
Wie kann ich beim Zoomen die Kantenglättung verhindern?

Hier der Code der das geglättete Ergebnis liefert:


 protected override void OnPaint(PaintEventArgs e)
        {
            base.OnPaint(e);

            _canvas.Width = _width * _zoomFactor;
            _canvas.Height = _height * _zoomFactor;
            e.Graphics.SmoothingMode = SmoothingMode.None;
            e.Graphics.InterpolationMode = InterpolationMode.NearestNeighbor;
            
            // Create canvas and set clipping          
            Region clip = new Region(_canvas);
            clip.Intersect(e.Graphics.Clip);
            e.Graphics.Clip = clip;
            e.Graphics.Clear(_bgColor);
            
            /* Replaced by "e.Graphics.PageScale = _zoomFactor;": */
            //Matrix mat = new Matrix();
            //mat.Scale(_zoomFactor, _zoomFactor, MatrixOrder.Append); //zoom to _zoomFactor
            //e.Graphics.Transform = mat;
            
            e.Graphics.PageScale = _zoomFactor;

            foreach (BaseWidgetMdl vm in _model.Widgets)
            {
                if (vm.drawer != null)
                {
                    vm.drawer.Draw(e.Graphics);
                }
            }
        }

P
peterguy Themenstarter:in
23 Beiträge seit 2009
vor 9 Jahren
P
peterguy Themenstarter:in
23 Beiträge seit 2009
vor 9 Jahren

Sollzustand (Screenshot mit Paint bearbeitet):

Z
403 Beiträge seit 2007
vor 9 Jahren

Ich denke dazu musst du zunächst Zeichnen und dann Skalieren.

P
peterguy Themenstarter:in
23 Beiträge seit 2009
vor 9 Jahren

Danke für den Tipp.

Ich habe mir zwischenzeitlich so beholfen dass ich erst in Originalgröße in ein Bitmap zeichne und dann beliebig hoch skaliere. Hierdurch habe ich auch die Möglichkeit das Bitmap auf Pixel Ebene zu manipulieren.

Für das Verschieben der Objekte mit der Maus werde ich dann eine(unsichtbaren) Ebene mit GraphicsPath Objekten einrichten.