前段时间我正在尝试为我网站的后端创建一个图片上传工具。我设法实现了这一目标,但是在较小的图像上我的图像质量仍然很差。
我需要创建4张图片:
我通常在上传之前手动调整大小并用Photoshop或其他东西成像到1800 x 1800,然后使用下面的代码上传和调整大小(图像都是jpgs)
变量是:
分辨率=质量jpg分辨率0-100,我在这些例子中使用80
Public Shared Sub ResizeImages(FileName, NewFileName, maxWidth, maxHeight, uploadDir, resolution)
Try
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(resolution, Int32))
myEncoderParameters.Param(0) = myEncoderParameter
canvas.CompositingQuality = System.Drawing.Drawing2D.CompositingQuality.HighQuality
canvas.InterpolationMode = System.Drawing.Drawing2D.InterpolationMode.HighQualityBicubic
canvas.SmoothingMode = System.Drawing.Drawing2D.SmoothingMode.HighQuality
canvas.DrawImage(newImg, New Rectangle(0, 0, newWidth, newHeight))
newImg.Save(uploadDir & (NewFileName), getCodec("image/jpeg"), myEncoderParameters)
'*** Close ***'
canvas.Dispose()
originalImg.Dispose()
newImg.Dispose()
'*** Nothing ***'
canvas = Nothing
newImg = Nothing
originalImg = Nothing
Catch ex As Exception
HttpContext.Current.Response.Write(ex.ToString & " " & uploadDir & " " & FileName & " _ " & NewFileName)
End Try
End Sub
要实现所有四个图像,我将所需的大小作为列表传递,然后按照预期文件大小的降序循环该列表,因此,首先是最大的一个,然后我将最近上传的图像传递给函数作为FileName
参数,这样每次,函数都会收到一个较小的图像,所以不要试图将2000x2000px图像的大小调整为50x50px,因为我从阅读各种帖子中意识到,这种大幅减少会导致质量不佳。 / p>
在这种方法中运行循环,我的小缩略图质量非常好,但我的中间图像仍然很差。
这里它们按大小顺序递减:
http://www.hartnollguitars.co.uk/Products2/0/0/0/9/6/57/1347831580.jpg http://www.hartnollguitars.co.uk/Products2/0/0/0/9/6/57/1347831580-dis.jpg http://www.hartnollguitars.co.uk/Products2/0/0/0/9/6/57/1347831580-se.jpg http://www.hartnollguitars.co.uk/Products2/0/0/0/9/6/57/1347831580-tb.jpg
正如您所看到的,“搜索”和“显示”图像在吉他边缘仍然是块状的。
我做错了什么?!
如果我的减少很多,我将如何进行内存逐渐减少。
我的意思是,令我感到震惊的是,上面的函数每次都将文件保存到光盘,这必须花费一些时间,所以如果我要循环缩小功能,减小图像的大小,在内存中以小增量(例如每次10%),然后在缩小达到正确大小时将最终图像保存到光盘。我不知道怎么做。
我正在使用ASP.NET 2.0并且它相对较新,所以我并不完全了解可用的所有方法。
任何代码示例都会有很大帮助!
由于
答案 0 :(得分:1)
你做错了是你使用Bitmap
构造函数创建缩小尺寸的图像,然后将该图像绘制到自身上。 Bitmap
构造函数自然不能使用您稍后在Graphics
对象中设置的质量设置来调整图像大小,因此质量会很差。
相反,您应该使用仅采用大小的构造函数创建一个空白Bitmap
对象:
Dim newImg As New Bitmap(newWidth, newHeight)
然后你应该在画布上绘制原始图像:
canvas.DrawImage(originalImg, New Rectangle(0, 0, newWidth, newHeight))