Esto volverá a tamaño de cualquier imagen utilizando la mejor calidad con el respaldo de 32 bpp con alfa. La nueva imagen tendrá la imagen original centrada dentro del nuevo en la relación de aspecto original.
#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' no se aplica aquí, sólo es relevante para 2D dibujo vectorial métodos como 'Graphics.DrawLine' – alldayremix
Tenga cuidado con esto. La sección 'Con grDest' parecía aumentar ligeramente los valores alfa, solo perceptible en el procesamiento iterativo de la misma imagen con un elemento semi-opaco en la imagen. Con el tiempo, esto se hizo cada vez menos opaco. Comenté la parte .SmoothingMode y cambié CompositingMode a SourceCopy. Todavía estoy probando, pero uno de estos dos parece haberlo hecho. Temo que no puedo dar una respuesta precisa ya que no entiendo bien a GDI. Tal vez @Carter pueda ayudar aún más dado su conocimiento de GDI. – stigzler