Какой лучший способ «квадратировать» изображение в .NET? - PullRequest
1 голос
/ 17 октября 2008

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

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

     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)

Ответы [ 2 ]

4 голосов
/ 17 октября 2008

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

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

Разве это не сработает?

2 голосов
/ 19 октября 2008

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

Псевдокод общего решения для размещения изображения imageWidth x imageHeight в thumbWidth x 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);
...