用VB.net调整图像大小、压缩和平滑
我花了相当长的时间在谷歌上搜索这篇文章,读了很多文章,但我似乎一直在兜圈子,现在非常困惑,似乎什么地方都没找到 我试图得到一个图像的4个不同大小的版本,为了实现这一点,我有一个大小的数组,并循环下面的函数 这是可行的,并且达到了预期的效果,除了较小的图像非常块状,我无法获得平滑效果以达到我预期的效果 对于老式的ASP Classic,我使用了Persits ASPUpload/jpeg插件,它做了很好的平滑调整。有了.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
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。你需要锐化效果。