Какой самый лучший способ & # 8220; квадрат & # 8221; изображение в .NET?
-
03-07-2019 - |
Вопрос
Мне нужно создать эскизы для нескольких 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);