Größe ändern, komprimieren und glätten von Bildern mit VB.net
Habe ich damit verbracht eine Recht lange Zeit, Googeln Sie diese Lesen und verschiedene Artikel, aber ich scheine zu haben, führen mich im Kreis und bin jetzt sehr verwirrt, und scheinen nicht zu gelungen, um überall zu bekommen!
Ich versuche, 4 Verschieden große Versionen eines Bildes, um dies zu erreichen, habe ich ein array von Größen und bin looping-Funktion unten.
Dies funktioniert, und tut alles erwartet, außer, die kleineren Bilder sind sehr blocky und ich kann die Glättung zu erreichen, der Effekt, den ich erwarten würde.
Mit old-school-ASP-Klassiker, den ich verwendet Persits ASPUpload - /jpeg-plugin und es hat schöne, glatte verändern. Mit .NET ich kämpfen.
Public Shared Sub ResizeImages(FileName, NewFileName, maxWidth, maxHeight, uploadDir, qualityPercent)
Dim originalImg As System.Drawing.Image = System.Drawing.Image.FromFile(uploadDir & FileName)
Dim aspectRatio As Double
Dim newHeight As Integer
Dim newWidth As Integer
'*** Calculate Size ***'
If originalImg.Width > maxWidth Or originalImg.Height > maxHeight Then
If originalImg.Width >= originalImg.Height Then ' image is wider than tall
newWidth = maxWidth
aspectRatio = originalImg.Width / maxWidth
newHeight = originalImg.Height / aspectRatio
Else ' image is taller than wide
newHeight = maxHeight
aspectRatio = originalImg.Height / maxHeight
newWidth = originalImg.Width / aspectRatio
End If
Else ' if image is not larger than max then keep original size
newWidth = originalImg.Width
newHeight = originalImg.Height
End If
Dim newImg As New Bitmap(originalImg, CInt(newWidth), CInt(newHeight)) '' blank canvas
Dim canvas As Graphics = Graphics.FromImage(newImg) 'graphics element
'*** compress ***'
Dim myEncoderParameters As EncoderParameters
myEncoderParameters = New EncoderParameters(1)
' set quality level based on "resolution" variable
Dim myEncoderParameter = New EncoderParameter(System.Drawing.Imaging.Encoder.Quality, CType(qualityPercent, Int32))
myEncoderParameters.Param(0) = myEncoderParameter
'*** Save As ***'
canvas.SmoothingMode = Drawing.Drawing2D.SmoothingMode.AntiAlias
canvas.DrawImage(newImg, New Point(0, 0))
newImg.Save(uploadDir & NewFileName, getCodec("image/jpeg"), myEncoderParameters)
'*** Close ***'
originalImg.Dispose()
newImg.Dispose()
'*** Nothing ***'
newImg = Nothing
originalImg = Nothing
End Sub
Public Shared Function getCodec(getThis) As Drawing.Imaging.ImageCodecInfo
Dim output As Drawing.Imaging.ImageCodecInfo
Dim codecs As Imaging.ImageCodecInfo() = Imaging.ImageCodecInfo.GetImageEncoders
For Each codec As Imaging.ImageCodecInfo In codecs
If codec.MimeType = getThis Then
output = codec
End If
Next codec
Return output
End Function
Ich das Gefühl, ich könnte sein Vermischung der Typen hier?
Ich habe eine System.Drawing.Image
eine BitMap
und ein Graphic
Objekt während der Verlauf der Funktion oben, und fühle, dass ich könnte versuchen, die für die Glättung der falschen element, oder in der falschen Phase der Codierung?
Den System.Drawing.Image
- Objekt geladen wird die Datei auf dem server gespeichert, dann berechne ich das Seitenverhältnis und die neue Größe erforderlich, erstellen Sie eine neue BitMap
dieser Größe und speichern Sie es auf einem Graphics
Objekt.
Ist das richtig?
Was muss ich ändern, um zu einem weicheren Größe?
Wie üblich, jede Hilfe sehr geschätzt.
Du musst angemeldet sein, um einen Kommentar abzugeben.
versuchen, InterpolationMode