Pregunta

Necesito generar miniaturas para un montón de jpegs (más de 200,000) pero quiero asegurarme de que todos mis pulgares tengan la misma altura y anchura. Sin embargo, no quiero cambiar las proporciones de la imagen, así que necesito agregar un espacio vacío a la dimensión más corta para "cuadrarla". El color de fondo del espacio vacío es variable.

Aquí está el fragmento de código que estoy usando para generar los pulgares. ¿Cuál es la mejor manera de hacer la cuadratura?

     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)
¿Fue útil?

Solución

¿Qué tal esto? Tal vez debería dibujar un rectángulo negro (o de cualquier color) en el mapa de bits primero.

Y luego, cuando coloque la imagen redimensionada, calcule la ubicación de la imagen en función de la dimensión que sea más corta y luego mueva esa dimensión a la mitad de la diferencia (y mantenga la otra en 0).

¿No funcionaría eso?

Otros consejos

Como dijo Vaibhav , primero pinte toda el área de la miniatura con negro. Esto será más simple que ajustar primero la imagen en la miniatura y luego determinar qué rectángulos pintar de negro para lograr pillarboxing o letterboxing .

Seudocódigo para una solución general que se ajuste a una imagen de imageWidth x imageHeight en una thumbWidth x thumbHeight Área (no tiene que ser un cuadrado):

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);
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top