Cela redimensionner une image à l'aide de la meilleure qualité avec prise en charge 32bpp avec alpha. La nouvelle image aura l'image originale centrée à l'intérieur du nouveau au format d'origine.
#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' ne s'applique pas ici, il est pertinent que pour le dessin vectoriel 2D méthodes telles que 'Graphics.DrawLine' – alldayremix
Soyez prudent avec cela. La section 'Avec grDest' a semblé augmenter légèrement les valeurs alpha, seulement visible sur le traitement itératif de la même image avec un élément semi-opaque à l'image. Au fil du temps, cela est devenu de moins en moins opaque. J'ai commenté la partie .SmoothingMode et Changed CompositingMode à SourceCopy. Toujours en train de tester, mais l'un d'eux semble l'avoir fait. Peur je ne peux pas donner une réponse précise comme ne comprends pas bien GDI. Peut-être que @Carter pourrait être en mesure d'aider davantage étant donné sa connaissance du GDI. – stigzler