2010-12-14 50 views
3

Je fais un outil de recadrage pour les images et je ne peux pas pour la vie de me comprendre pourquoi elle produit des images qui elle produit ...Quel est le problème avec cette image cropper?

Je suis la réponse acceptée here, mais il est encore être bizarre ... Voici mon code:

public void Crop(
    string FileName, 
    Crop Crop) { 
    using (Bitmap Source = ((Bitmap)Image.FromFile(FileName))) { 
     using (Bitmap Target = new Bitmap(Crop.Width, Crop.Height)) { 
      using (Graphics Graphics = Graphics.FromImage(Target)) { 
       Graphics.DrawImage(Source, new Rectangle(new Point(Crop.Left, Crop.Top), new Size(Crop.Width, Crop.Height)), new Rectangle(new Point(0, 0), new Size(Target.Width, Target.Height)), GraphicsUnit.Pixel); 
      }; 

      Target.Save((FileName + ".temp"), JpegCodecInfo, HighQualityEncoder); 
     }; 
    }; 


    this.NormalizeFileName(FileName); 
} 

Aidez-moi s'il vous plaît. Je joins une image de ce que je veux ... alt text

MISE À JOUR

Pour @Aaronontheweb, voici la classe Crop et comment il est peuplé:

public class Crop { 
    [Required] 
    public short Height { get; set; } 

    [Required] 
    public short Left { get; set; } 

    [Required] 
    public short Top { get; set; } 

    [Required] 
    public short Width { get; set; } 
} 

Et le jQuery qui renseigne le:

$("#Image input:submit").bind("click", function() { 
    $("#Crop\\.Height").val(Crop.height()); 
    $("#Crop\\.Left").val(Crop.position().left); 
    $("#Crop\\.Top").val(Crop.position().top); 
    $("#Crop\\.Width").val(Crop.width()); 
}); 

MISE À JOUR 2

Peu importe, je l'ai. J'ai fait une sieste après avoir posé ma question juste pour me vider la tête et quand je l'ai regardé de nouveau après, j'ai décidé de changer les deux rectangles et de voir ce qui se passe. Eh bien, devinez quoi, ça l'a corrigé.

À ce stade, je dois dire que les noms donnés dans la documentation de l'API sont trompeurs. Par exemple, les documents se réfèrent à l'image de sortie source et l'image d'entrée afficher. Peut-être que l'API devrait être mise à jour pour avoir une meilleure dénomination?

+1

Je ne suis pas sûr mais je pense que vous avez vos rectangles vers l'arrière ... Drawimage (image, destRect, sourceRect, ...) vérifiez le document API ... – Jaime

+0

Pourriez-vous poster la source de votre classe de culture? Cela ressemble à une erreur d'inversion X/Y (ce qui signifie que vous avez échangé un X avec un Y quelque part dans votre appel de fonction .DrawImage) – Aaronontheweb

+0

@Aaronontheweb, j'ai mis à jour mon message avec les informations que vous vouliez. – Gup3rSuR4c

Répondre

3

Dans la ligne suivante:

Graphics.DrawImage (Source, nouveau, nouveau Rectangle Rectangle (nouveau point (Crop.Left, Crop.Top), nouvelle taille (Crop.Width, Crop.Height)) (new Point (0, 0), nouvelle taille (Target.Width, Target.Height)), GraphicsUnit.Pixel);

Assurez-vous que Crop.Left et Crop.Top est défini sur 0, sinon il commencera à définir les pixels au décalage étrange que vous obtenez. Vous pouvez également simplement le remplacer par la ligne suivante à tester:

Graphics.DrawImage (Source, nouveau Rectangle (nouveau Point (0,0), nouvelle taille (Crop.Width, Crop.Height)), nouveau Rectangle (new Point (0, 0), nouvelle taille (Target.Width, Target.Height)), GraphicsUnit.Pixel);

+1

S'il utilisait .DrawImage de cette façon, tout ce qu'il pourrait recadrer seraient des images qui commencent dans le coin supérieur gauche de ses images source. Le décalage est nécessaire pour avoir un comportement de recadrage. – Aaronontheweb

+0

Exactement ce que je pensais, il défait complètement l'effort de recadrage de l'image ... – Gup3rSuR4c

+0

Je vois votre point, mais le premier rectangle est le rectangle de destination et il commencera à dessiner à ce point dans le rectangle de destination, alors ne devrait-il pas plutôt définir le décalage sur le second rectangle alors? –