2009-08-15 8 views
4

Sorry, wenn der Titel ein wenig kryptisch ist. Grundsätzlich erstelle ich ein Zoom-Steuerelement in einer C# -Forms-App, die Idee ist, dass ich ein Bild nach Faktoren zoomen kann, dh. 1x, 2x, 4x, 8x. Ich brauche das Bild, um pixelig zu bleiben, dh. nächste Nachbarn. Das Zoomen funktioniert wunderbar, außer dass, wenn ich den Interp-Modus als nächsten Nachbarn auswähle, wenn ich mit den Grenzpixeln arbeite, wird die innere Farbe als Standard verwendet. Das heißt, dass die äußeren Pixel die halbe Breite wie die inneren Pixel haben, wo das Problem wirklich auftritt, wenn ich einen Tooltip hinzufüge, um die x, y-Koordinaten des aktuellen Mausd-over-Pixels anzuzeigen aus. Um klar zu sein, es ist der Grund geworfen wird ausgeschaltet, weil ich das aktuelle Pixel zu berechnen als:Paint.exe Style Zoom, Nächster Nachbar Interpolation Halfing Grenze Pixel

void m_pictureBox_MouseMove(object sender, MouseEventArgs e) 
{ 
    int x = e.Location.X/m_zoomFactor; 
    int y = e.Location.Y/m_zoomFactor; 
} 

und da die äußere Pixel sind die Hälfte der Breite ... gut Sie erhalten das Bild.

Der Zeichencode ist einfach:

void m_pictureBox_Paint(object sender, PaintEventArgs e) 
{ 
    if (m_pictureBox.Image!=null) 
    { 
     e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; 
     e.Graphics.ScaleTransform((float)m_zoomFactor, (float)m_zoomFactor); 
     e.Graphics.DrawImage(m_pictureBox.Image, 0, 0); 
    }    
} 

Die Bildkontrolle innerhalb meiner benutzerdefinierten ‚Zoomcontrol‘ gehostet wird, die sich von der ‚Panel‘ Kontrolle geerbt ist.

Meine Frage ist im Grunde, kann jeder Körper mir helfen, die Grenze Pixelproblem lösen und gibt es eine bessere Möglichkeit, Zoom-Funktionalität zu bekommen?

Antwort

5

Sie müssen auch Graphics.PixelOffsetMode ändern. Die Standardeinstellung lautet "Keine", was für die Interpolation akzeptabel ist, aber nicht, wenn Sie die Pixel in Blöcke aufblasen. Ändern Sie es in die Hälfte. Zum Beispiel:

public partial class Form1 : Form { 
    public Form1() { 
     InitializeComponent(); 
    } 

    private float mZoom = 10; 

    protected override void OnPaint(PaintEventArgs e) { 
     e.Graphics.PixelOffsetMode = System.Drawing.Drawing2D.PixelOffsetMode.Half; 
     e.Graphics.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.NearestNeighbor; 
     Image img = Properties.Resources.SampleImage; 
     RectangleF rc = new RectangleF(0, 0, mZoom * img.Width, mZoom * img.Height); 
     e.Graphics.DrawImage(img, rc); 
    } 
    } 
+0

Vielen Dank es funktioniert perfekt – DeusAduro

+0

Danke euch beiden. Ich wollte gerade die gleiche Frage stellen. * (Das Schreiben der Frage ist ein besserer Weg, um eine verwandte Frage zu finden, bei der das Problem bereits gelöst ist, als die schlechte Suchfunktion von SO zu verwenden.) * – Bitterblue

Verwandte Themen