2010-01-04 6 views
1

Je fais une sorte d'éditeur graphique limité dans une application de bureau dans C# 3.5 GDI. l'utilisateur sélectionne d'abord une image qui est montrée dans un contrôle de la boîte à images dont la taille est plus petite afin que le redimensionnement de l'image soit fait pour s'adapter à l'image.Recadrer une image en C#

Pour recadrer, l'utilisateur sélectionne la zone à recadrer. il y a un certain nombre d'exemples sur le net qui explique comment recadrer l'image mais aucun d'eux n'explique le cas où la zone est sélectionnée sur une vignette mais le recadrage est fait sur l'image originale c'est à dire une sorte de mapping entre les deux images.

tous les éditeurs graphiques offrent des fonctionnalités similaires. pouvez-vous me diriger vers un lien qui explique comment faire cela?

Répondre

4

Il me semble que vous devez calculer vous-même le rectangle de recadrage sur l'image originale en fonction des tailles relatives de l'image et de la vignette.

public static class CoordinateTransformationHelper 
{ 
    public static Point ThumbToOriginal(this Point point, Size thumb, Size source) 
    { 
     Point rc = new Point(); 
     rc.X = (int)((double)point.X/thumb.Width * source.Width); 
     rc.Y = (int)((double)point.Y/thumb.Height * source.Height); 
     return rc; 
    } 

    public static Size ThumbToOriginal(this Size size, Size thumb, Size source) 
    { 
     Point pt = new Point(size); 
     Size rc = new Size(pt.ThumbToOriginal(thumb, source)); 
     return rc; 
    } 

    public static Rectangle ThumbToOriginal(this Rectangle rect, Size thumb, Size source) 
    { 
     Rectangle rc = new Rectangle(); 
     rc.Location = rect.Location.ThumbToOriginal(thumb, source); 
     rc.Size = rect.Size.ThumbToOriginal(thumb, source); 
     return rc; 
    } 
} 

Exemple d'utilisation:

Size thumb = new Size(10, 10); 
Size source = new Size(100, 100); 
Console.WriteLine(new Point(4, 4).ThumbToOriginal(thumb, source)); 
Console.WriteLine(new Rectangle(4, 4, 5, 5).ThumbToOriginal(thumb, source)); 
+0

oui exactement, connaissez-vous un article ou un morceau de code? btw est-il réellement nécessaire? aucun des codes que j'ai trouvés sur le net ne parle de cette chose. – Haris

+0

Ajout de ma mise en œuvre pour cela. AVIS DE NON-RESPONSABILITÉ: C'est juste quelque chose que j'ai giflé ensemble en 5 minutes, ce n'est pas complet, optimisé, ou quoi que ce soit. –

3

est ici une méthode vraiment facile à rogner une System.Drawing.Image

public static Image CropImage(Image image, Rectangle area) 
{ 
    Image cropped = null; 

    using (Bitmap i = new Bitmap(image)) 
    using (Bitmap c = i.Clone(area, i.PixelFormat)) 
     cropped = (Image)c; 

    return cropped; 
} 

passe dans une image et la zone que vous souhaitez rogner et cela devrait le faire

Questions connexes