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.

Schreibe einen Kommentar