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

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);
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top