2008-10-17 10 views
1

J'ai besoin de générer thumbnails pour un tas de jpeg (200,000+) mais je veux m'assurer que tous mes pouces ont une hauteur et une largeur égales. Cependant, je ne veux pas changer les proportions de l'image, j'ai donc besoin d'ajouter de l'espace vide à la dimension la plus courte pour "l'ajuster". La couleur de fond de l'espace vide est variable.Quelle est la meilleure façon de "mettre en carré" une image dans .NET?

Voici l'extrait de code que j'utilise pour générer les pouces. Quelle est la meilleure façon de faire la quadrature?

 Dim imgDest As System.Drawing.Bitmap = New Bitmap(ScaleWidth, ScaleHeight) 
    imgDest.SetResolution(TARGET_RESOLUTION, TARGET_RESOLUTION) 
    Dim grDest As Graphics = Graphics.FromImage(imgDest) 

    grDest.DrawImage(SourceImage, 0, 0, imgDest.Width, imgDest.Height) 

Répondre

4

Et à ce sujet. Peut-être que vous devriez d'abord dessiner un rectangle noir (ou de n'importe quelle couleur) sur le bitmap. Ensuite, lorsque vous placez l'image redimensionnée, calculez simplement l'emplacement de l'image en fonction de la dimension la plus courte, puis déplacez cette dimension de la moitié de la différence (et maintenez l'autre sur 0).

Cela ne fonctionnerait-il pas?

2

Comme Vaibhav dit, d'abord peindre toute la zone des vignettes avec du noir. Cela sera plus simple que d'ajuster d'abord l'image dans la vignette, puis de déterminer les rectangles à peindre en noir pour atteindre pillarboxing ou letterboxing.

pseudo-code pour une solution générale pour être compatibles avec un imageWidth x imageHeight image dans un thumbWidth x thumbHeight (ne doit pas être un carré) Surface:

imageRatio = imageWidth/imageHeight; 
thumbRatio = thumbWidth/thumbHeight; 

zoomFactor = imageRatio >= thumbRatio 
    ? thumbWidth/imageWidth 
    : thumbHeight/imageHeight; 

destWidth = imageWidth * zoomFactor; 
destHeight = imageHeight * zoomFactor; 

drawImage(
    (thumbWidth - destWidth) >> 1, 
    (thumbHeight - destHeight) >> 1, 
    destWidth, 
    destHeight);