2009-08-15 9 views
4

Désolé si le titre est un peu énigmatique. Fondamentalement, je crée un contrôle de zoom dans une application de formulaires C#, l'idée est que je peux zoomer une image par des facteurs, à savoir. 1x, 2x, 4x, 8x. J'ai besoin de l'image pour rester pixélisée, ie. voisins les plus proches. Le zoom fonctionne à merveille si ce n'est que lorsque je sélectionne le mode Interp pour être le plus proche des voisins quand je travaille avec les pixels limites, c'est par défaut la couleur intérieure. C'est-à-dire que les pixels extérieurs semblent avoir la moitié de la largeur des pixels internes, où le problème se produit réellement lorsque j'ajoute une info-bulle pour afficher les coordonnées x, y du pixel en cours de projection. de. Pour être clair, la raison pour laquelle il est jeté hors parce que je calcule le pixel courant comme:Paint.exe Style Zoom, NearestNeighbour Limite de demi-interpolation pixels

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

et depuis le pixel extérieur sont la moitié de la largeur ... et vous obtenez l'image.

Le code de dessin est simplement:

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); 
    }    
} 

Le contrôle de l'image est hébergé dans mon custom « ZoomControl » qui est lui-même hérité de la commande « Panel ».

Ma question est la suivante: est-ce que n'importe quel organisme peut m'aider à résoudre le problème des pixels limites et existe-t-il un meilleur moyen d'obtenir la fonctionnalité de zoom?

Répondre

5

Vous devez également modifier Graphics.PixelOffsetMode. La valeur par défaut est None, ce qui est correct pour l'interpolation mais pas quand vous faites exploser les pixels en blocs. Changez-le à moitié. Par exemple:

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

Merci, cela fonctionne parfaitement – DeusAduro

+0

Merci à vous deux. J'étais sur le point de poser exactement la même question. * (Rédaction de la question est une meilleure façon de trouver une question connexe où le problème est déjà résolu que d'utiliser la mauvaise fonction de recherche de SO.) * – Bitterblue