Как лучше всего выровнять изображение в .NET?

Мне нужно сгенерировать эскизы для куча jpeg (более 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)

person Mike L    schedule 17.10.2008    source источник


Ответы (2)


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

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

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

person Vaibhav    schedule 17.10.2008

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

Псевдокод для общего решения для размещения изображения 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);
person Ates Goral    schedule 19.10.2008