用VB.net调整图像大小、压缩和平滑

用VB.net调整图像大小、压缩和平滑,vb.net,image-processing,graphics,bitmap,system.drawing,Vb.net,Image Processing,Graphics,Bitmap,System.drawing,我花了相当长的时间在谷歌上搜索这篇文章,读了很多文章,但我似乎一直在兜圈子,现在非常困惑,似乎什么地方都没找到 我试图得到一个图像的4个不同大小的版本,为了实现这一点,我有一个大小的数组,并循环下面的函数 这是可行的,并且达到了预期的效果,除了较小的图像非常块状,我无法获得平滑效果以达到我预期的效果 对于老式的ASP Classic,我使用了Persits ASPUpload/jpeg插件,它做了很好的平滑调整。有了.NET,我很挣扎 Public Shared Sub ResizeImages

我花了相当长的时间在谷歌上搜索这篇文章,读了很多文章,但我似乎一直在兜圈子,现在非常困惑,似乎什么地方都没找到

我试图得到一个图像的4个不同大小的版本,为了实现这一点,我有一个大小的数组,并循环下面的函数

这是可行的,并且达到了预期的效果,除了较小的图像非常块状,我无法获得平滑效果以达到我预期的效果

对于老式的ASP Classic,我使用了Persits ASPUpload/jpeg插件,它做了很好的平滑调整。有了.NET,我很挣扎

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
我觉得我可能在这里把类型弄混了

在执行上述功能的过程中,我有一个
系统.Drawing.Image
、一个
位图
和一个
图形
对象,我觉得我可能试图将平滑应用到错误的元素,或者在错误的编码阶段

System.Drawing.Image
对象加载保存在服务器上的文件,然后我计算纵横比和所需的新大小,创建此大小的新
位图
,并将其保存到
图形
对象

这是正确的吗

我需要修改什么才能实现更平滑的调整


如往常一样,任何帮助都将不胜感激。

尝试使用插值模式

Private imgSource As System.Drawing.Image
Private imgOutput As System.Drawing.Image
Public Function Resize(ByVal intPercent As Integer, ByVal intType As Integer)
    'resize the image by percent
    Dim intX, intY As Integer
    intX = Int(imgSource.Width / 100 * intPercent)
    intY = Int(imgSource.Height / 100 * intPercent)
    Dim bm As Drawing.Bitmap = New System.Drawing.Bitmap(intX, intY)
    Dim g As System.Drawing.Graphics = Drawing.Graphics.FromImage(bm)

    Select Case intType
        Case 0
            g.InterpolationMode = Drawing.Drawing2D.InterpolationMode.Default
        Case 1
            g.InterpolationMode = Drawing.Drawing2D.InterpolationMode.High
        Case 2
            g.InterpolationMode = Drawing.Drawing2D.InterpolationMode.HighQualityBilinear
        Case 3
            g.InterpolationMode = Drawing.Drawing2D.InterpolationMode.HighQualityBicubic
    End Select

    g.DrawImage(imgSource, 0, 0, intX, intY)
    imgOutput = bm

End Function

嗨,谢谢你的回复。我试过你的建议,但我看不出任何插值情况下的输出图像有什么不同,也尝试过将SmoothingMode更改为High Quality,这也没有明显的区别。你的代码对我来说非常好,vs2010和.net4。源图像5616 x 3744 996.77 KB JPG,输出图像300 x 200 8.79 KB JPG。qualityPercent是80。哦,也许我只是想把东西做得太小,我想把显示图像做成180x250左右的样子,它们会变得块状。1800 x 1800的放大图像与您的修改很好。如果您将图像转换为非常小的图像,请不要使用AntiAlias。你需要锐化效果。