Dies wird die beste Qualität mit Unterstützung jedes Bild unter Verwendung von für 32bpp mit Alpha-Größe neu. Beim neuen Bild wird das Originalbild im ursprünglichen Seitenverhältnis innerhalb des neuen Bildes zentriert.
#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' gilt hier nicht, es für 2D-Vektor-Zeichenprogramm ist nur relevant, Methoden wie 'Graphics.DrawLine' – alldayremix
Seien Sie vorsichtig damit. Die 'With grDest'-Sektion schien die Alpha-Werte nur geringfügig zu erhöhen, was sich nur bei der iterativen Verarbeitung des gleichen Bildes mit einem halb-opaken Element im Bild bemerkbar machte. Im Laufe der Zeit wurde dies immer undurchsichtiger. Ich habe den .SmoothingMode-Teil und den CompositingMode zu SourceCopy auskommentiert. Noch Tests, aber einer von diesen beiden scheint es getan zu haben. Angst, ich kann keine genaue Antwort geben, da ich GDI nicht so gut verstehe. Vielleicht kann @Carter angesichts seines Wissens über GDI weiter helfen. – stigzler