2008-10-17 6 views
1

Мне нужно создать thumbnails для кучи jpegs (200 000+), но я хочу убедиться, что все мои большие пальцы имеют равную высоту и ширину. Тем не менее, я не хочу изменять пропорции изображения, поэтому мне нужно добавить пустое пространство в более короткое измерение, чтобы «квадратировать его». Цвет фона пустого пространства является переменным.Каков наилучший способ «квадратного» изображения в .NET?

Вот фрагмент кода, который я использую для создания больших пальцев. Каков наилучший способ сделать квадрат?

 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) 

ответ

4

Как насчет этого. Возможно, сначала вы должны нарисовать черный (или любой цвет) прямоугольник на растровом изображении.

А затем, когда вы размещаете измененное изображение, просто вычислите размещение изображения на основе того, какое измерение будет короче, а затем переместите это измерение на половину разницы (и сохраните другую на 0).

Не работает ли это?

2

Vaibhav сказал, сначала нарисуйте всю область миниатюр черным цветом. Это будет проще, чем сначала установить изображение в миниатюру, а затем определить, какие прямоугольники для рисования черные, чтобы достичь pillarboxing или letterboxing.

Псевдо-код для общего решения, чтобы соответствовать imageWidth х imageHeight изображение в thumbWidth х thumbHeight (не обязательно должна быть квадратной) площадь:

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);