2010-08-05 4 views
3

Sur mon site, les utilisateurs peuvent télécharger des photos. Je compresse et redimensionne actuellement la photo pour m'assurer que ce ne sont pas des fichiers énormes. Mais cela crée des photos de dimensions variables ... ce qui rend le site un peu "moche" selon moi.Comment cadrer une photo téléchargée sans rembourrage avec un espace blanc, en C#?

Je voudrais m'assurer que les vignettes sont des images carrées, mais pas en utilisant un remplissage. C'est bon s'il y a une perte de la photo dans la vignette. Je voudrais garder la fidélité de la photo haute, même si cela signifie que certains recadrages doivent se produire.

+2

Une petite astuce à faire une fois sur un site: si l'image d'origine est plus large que haute, rognez une quantité égale de chaque côté. Mais si l'image d'origine est plus grande que large, recadrez-en plus du bas que du haut, et dans mon expérience, vous aurez moins de chances de perdre des détails précieux (par exemple, dans une photo de portrait, vous couperez le les jambes du sujet plutôt que leur visage!) – Carson63000

+0

@ Carson63000 - vous rock, c'est un excellent point à garder à l'esprit. Je vous remercie! – Chaddeus

Répondre

3

j'ai écrit un code pour faire cette chose exacte. J'ai choisi de le recadrer parce que redimensionner sans préserver le rapport d'aspect semble assez horrible. Je fais une culture alors Redimensionner pour créer une image thumnail:

public Bitmap CreateThumbnail(Bitmap RawImage) 
    { 
     int width = RawImage.Width; 
     int height = RawImage.Height; 

     Size ThumbnailDimensions = new Size(); 
     ThumbnailDimensions.Width = 100; 
     ThumbnailDimensions.Height = 100; 

     Rectangle cropArea = new Rectangle(); 
     if (width > height) 
     {    
      cropArea.Width = height; 
      cropArea.Height = height; 
      cropArea.X = 0; 
      cropArea.Y = 0;     
     } 
     else if (width < height) 
     { 
      cropArea.Width = width; 
      cropArea.Height = width; 
      cropArea.X = 0; 
      cropArea.Y = 0; 
     } 
     if(width != height) Bitmap thumbnail = CropImage(RawImage, cropArea); 

     thumbnail = ResizeImage(thumbnail, ThumbnailDimensions); 
     return thumbnail; 
    } 

Cette cultures juste du coin en haut à gauche puis redimensionne à mes dimensions miniatures.

+0

C'est à peu près exactement ce que je cherchais, merci beaucoup! – Chaddeus

+0

aucun problème amusez-vous. – Adrian

+5

Où est la mise en œuvre de "CropImage"? – Andrey

-1

Plutôt que de recadrer, je ferais que le div ou quoi que vous les mettiez dans une taille carrée fixe. Mettre à l'échelle l'image pour l'adapter à l'intérieur de ce carré.

Comment décideriez-vous de le recadrer? En haut à gauche? En bas à droite? Centre?

+0

Je ne veux pas faire de mise à l'échelle client, car c'est un problème de performances. Je prévois de recadrer en haut à gauche en utilisant la dimension la plus courte comme la taille, le carré. Puis Carson6300 mentionné, si elle est plus large que plus grand, la récolte égale de chaque côté. Si elle est plus grande que large, recadrer surtout par le bas. – Chaddeus

+0

Le problème avec ceci est que si vous prenez une grande image et que vous la réduisez simplement, le navigateur charge toujours la grande image. Multipliez cela par quelques images et votre charge de site Web accélère le réservoir. – Adrian

+0

@Chad, @antonlavy - Où dans ma réponse ai-je dit mise à l'échelle côté client? –

2

J'imagine que vous devez prendre la dimension la plus courte (soit w ou h), et l'utiliser comme dimension pour la création de l'image recadrée, essentiellement, vous pouvez recadrer et redimensionner l'image. Découvrez this article comme un exemple pour recadrer une image. Consultez également this Stack Overflow question en ce qui concerne la qualité d'image.

+0

C'est un bon point, utilisez la plus petite dimension pour les paramètres de recadrage. Merci. – Chaddeus

-1

Pour transformer un rectangle en carré, vous devez soit le recadrer, soit le redimensionner sans conserver le rapport d'aspect, ni recadrer (ou combiner).

est ici un code pour les cultures

http://snippets.dzone.com/posts/show/1484

(je travaille pour Atalasoft - dans notre DotImage photo SDK), il est

AtalaImage img = new AtalaImage("filename.jpg"); 
AtalaImage img2 = new CropCommand(/*point and size of crop */).Apply(img).Image; 
img2.Save("filename", new JpegEncoder(quality), null); 
Questions connexes