Какой самый лучший способ & # 8220; квадрат & # 8221; изображение в .NET?

StackOverflow https://stackoverflow.com/questions/212762

Вопрос

Мне нужно создать эскизы для нескольких 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)
Это было полезно?

Решение

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

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

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

Другие советы

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

Псевдокод для общего решения для размещения изображения 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);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top