Это будет изменить размер любого изображения с использованием наилучшего качества с поддержкой 32bpp с альфа. Новое изображение будет иметь исходное изображение, центрированное внутри нового, с исходным соотношением сторон.
#Region " ResizeImage "
Public Overloads Shared Function ResizeImage(SourceImage As Drawing.Image, TargetWidth As Int32, TargetHeight As Int32) As Drawing.Bitmap
Dim bmSource = New Drawing.Bitmap(SourceImage)
Return ResizeImage(bmSource, TargetWidth, TargetHeight)
End Function
Public Overloads Shared Function ResizeImage(bmSource As Drawing.Bitmap, TargetWidth As Int32, TargetHeight As Int32) As Drawing.Bitmap
Dim bmDest As New Drawing.Bitmap(TargetWidth, TargetHeight, Drawing.Imaging.PixelFormat.Format32bppArgb)
Dim nSourceAspectRatio = bmSource.Width/bmSource.Height
Dim nDestAspectRatio = bmDest.Width/bmDest.Height
Dim NewX = 0
Dim NewY = 0
Dim NewWidth = bmDest.Width
Dim NewHeight = bmDest.Height
If nDestAspectRatio = nSourceAspectRatio Then
'same ratio
ElseIf nDestAspectRatio > nSourceAspectRatio Then
'Source is taller
NewWidth = Convert.ToInt32(Math.Floor(nSourceAspectRatio * NewHeight))
NewX = Convert.ToInt32(Math.Floor((bmDest.Width - NewWidth)/2))
Else
'Source is wider
NewHeight = Convert.ToInt32(Math.Floor((1/nSourceAspectRatio) * NewWidth))
NewY = Convert.ToInt32(Math.Floor((bmDest.Height - NewHeight)/2))
End If
Using grDest = Drawing.Graphics.FromImage(bmDest)
With grDest
.CompositingQuality = Drawing.Drawing2D.CompositingQuality.HighQuality
.InterpolationMode = Drawing.Drawing2D.InterpolationMode.HighQualityBicubic
.PixelOffsetMode = Drawing.Drawing2D.PixelOffsetMode.HighQuality
.SmoothingMode = Drawing.Drawing2D.SmoothingMode.AntiAlias
.CompositingMode = Drawing.Drawing2D.CompositingMode.SourceOver
.DrawImage(bmSource, NewX, NewY, NewWidth, NewHeight)
End With
End Using
Return bmDest
End Function
#End Region
'Drawing2D.SmoothingMode' здесь не действует, это актуально только для 2D векторной графики такие методы, как 'Graphics.DrawLine' – alldayremix
Будьте осторожны с этим. Секция 'With grDest' казалась когда-либо слегка увеличивающей альфа-значения, только заметной при итеративной обработке одного и того же изображения с полупрозрачным элементом изображения. Со временем это становилось все менее и менее непрозрачным. Я прокомментировал часть .SmoothingMode и Changed CompositingMode для SourceCopy. Все еще тестирование, но один из этих двух, похоже, сделал это. Боюсь, я не могу дать точный ответ, так как не понимаю GDI. Возможно, @Carter может помочь в дальнейшем, учитывая его знания GDI. – stigzler