Qual é a melhor maneira de “quadrado” uma imagem em .NET?
-
03-07-2019 - |
Pergunta
Eu preciso gerar miniaturas para um bando de jpegs (200.000), mas eu quero ter certeza todos os meus polegares ter uma altura e largura iguais. No entanto, eu não quero alterar as proporções da imagem assim que eu preciso para adicionar espaço vazio para a dimensão mais curta para "quadrado-lo". cor de fundo do espaço vazio é variável.
Aqui está o trecho de código que estou usando para gerar os polegares. Qual é a melhor maneira de fazer a 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)
Solução
Como sobre isso. Talvez você devesse chamar um negro (ou qualquer cor) retângulo na Bitmap em primeiro lugar.
E então, quando você está colocando a imagem redimensionada, apenas calcular o posicionamento da imagem baseada em qualquer dimensão é mais curto, e em seguida, passar essa dimensão pela metade a diferença (e manter o outro em 0).
Não seria esse trabalho?
Outras dicas
Como Vaibhav disse, primeiro pintar a toda miniaturas área com preto. Este será mais simples do primeiro encaixe a imagem em miniatura e, em seguida, determinar quais retângulos para pintar de preto para alcançar pillarboxing ou letterboxing .
Pseudo-código para uma solução geral para encaixar uma imagem imageWidth
imageHeight
x em um thumbWidth
x thumbHeight
(não tem que ser um quadrado) Área:
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);