Domanda

Ho bisogno di generare miniature per un gruppo di jpeg (oltre 200.000) ma voglio assicurarmi che tutti i pollici abbiano la stessa altezza e larghezza. Tuttavia, non voglio cambiare le proporzioni dell'immagine, quindi ho bisogno di aggiungere spazio vuoto alla dimensione più corta per "quadrarlo". Il colore di sfondo dello spazio vuoto è variabile.

Ecco lo snippet di codice che sto usando per generare i pollici. Qual è il modo migliore per eseguire la quadratura?

     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)
È stato utile?

Soluzione

Che ne dici di questo. Forse dovresti prima disegnare un rettangolo nero (o di qualsiasi colore) su Bitmap.

Quindi, quando si posiziona l'immagine ridimensionata, è sufficiente calcolare la posizione dell'immagine in base alla dimensione più corta, quindi spostare quella dimensione della metà della differenza (e mantenere l'altra su 0).

Non funzionerebbe?

Altri suggerimenti

Come diceva Vaibhav , prima dipingi l'intera area delle miniature con il nero. Sarà più semplice che inserire prima l'immagine nell'anteprima e poi determinare quali rettangoli dipingere di nero per ottenere pillarboxing o letterboxing .

Pseudo-codice per una soluzione generale per adattarsi a imageWidth x imageHeight in un'immagine thumbWidth x thumbHeight (non deve essere un quadrato) area:

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top