Laden...

[gelöst] DrawImage, kopierter Bereich verpixelt bzw. zu klein

Erstellt von Birne vor 14 Jahren Letzter Beitrag vor 14 Jahren 1.954 Views
B
Birne Themenstarter:in
67 Beiträge seit 2009
vor 14 Jahren
[gelöst] DrawImage, kopierter Bereich verpixelt bzw. zu klein

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

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Birne,

irgendwie verstehe ich dein Problem nicht so ganz. Du kannst doch ganz einfach angeben, wie groß das Quell- und wie groß das Ziel-Rechteck sein soll.

Was das pixelige angeht hilft vielleicht [gelöst] Bitmap-Randproblem beim Verkleinern mit InterpolationMode.HighQualityBilinear.

BTW: Du solltest zum Zeichnen nie nicht CreateGraphics verwenden, sondern immer im OnPaint zeichnen. Siehe [Artikel] Zeichnen in Windows-Programmen.

herbivore

B
Birne Themenstarter:in
67 Beiträge seit 2009
vor 14 Jahren

Wenn ich dem Zielrechteck die selbe Größe wie dem Quellrechteck zuweise, ist das Bild mir unverständlich stark verzerrt, bzw. verpixelt.
Und wenn ich eine konkrete Größe angebe, so wird diese nicht richtig umgesetzt.
Gebe ich beispielsweise als Parameter 500 Pixel für die Width an und 500 Pixel für die Height, so verändert sich das Bild nicht merklich. Es ist dann nur etwa 50 Pixel lang und hoch 🙁

Theoretisch sollte die Kopie von der Auswahl doch aber genau eben dieser Auswahl entsprechen.
Das ist ja nun der Sinn einer Kopie.

Das man ledliglich im OnPaint Event zeichnen sollte ist mir durchaus bewusst, ändert aber nichts am Sachverhalt. Hätte das Codebeispiel nur aufgebläht.

Zum Testen kleiner Funktionen reichts imo.

49.485 Beiträge seit 2005
vor 14 Jahren

Hallo Birne,

möglicherweise sind für die Bilder unterschiedliche DPI-Einstellungen gesetzt. Obwohl das bei GraphicsUnit.Pixel nach meinen Verständnis keinen Einfluss haben dürfte, kann ich mich an Fälle erinnern, wo das die Ursache war. Ansonsten solltest du eine Überladung von DrawImage verwenden, bei der du Quell- und Zielrechteck gleichzeitig angeben kannst.

herbivore

B
Birne Themenstarter:in
67 Beiträge seit 2009
vor 14 Jahren

Ha !
Danke, genau daran lags 👍

Hier die entsprechenden Codezeilen


            bmp = (Bitmap)this.BackgroundImage;
            bmp.SetResolution(96, 96);