У платформы .NET в классе System.Drawing.Image существует метод GetThumbnailImage, который позволяет просто и быстро получить миниатюру изображения. Но качество полученной миниатюры оказалось хуже чем хотелось.
Следующий код был написан для решения данной проблемы и позволяет выбирать качество получаемой миниатюры и используемый метод интерполяции. Данный фрагмент кода подразумевает наличие на форме стандартных ASP.NET контролов FileUpload и Button
Imports System.IO
Imports System.Drawing
Imports System.Drawing.Imaging
Public Class WebForm1
Inherits System.Web.UI.Page
Protected Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
If FileUpload1.HasFile Then
' высота, ширина и коэффициент соотношения сторон изображения
Dim H, W As Integer, ratio As Decimal
' задаём ширину миниатюры изображения в 200 точек
Dim ThumbnailWidth As Integer = 200
' создаём объект System.Drawing.Image, загружаем в него изображения из стандартного контрола FileUpload
Dim objImage As System.Drawing.Image = System.Drawing.Image.FromStream(FileUpload1.PostedFile.InputStream)
' получаем реальные размеры изображения
H = objImage.Height
W = objImage.Width
' получаем значение высоты миниатюры для заданной ширины
ratio = W / ThumbnailWidth
H = Decimal.Floor(H / ratio)
' код создания миниатюры изображения
Dim grp As Graphics, bm As New Bitmap(ThumbnailWidth, H)
grp = Graphics.FromImage(bm)
grp.InterpolationMode = Drawing2D.InterpolationMode.Bicubic
grp.PixelOffsetMode = Drawing2D.PixelOffsetMode.HighQuality
grp.DrawImage(objImage, 0, 0, ThumbnailWidth, H)
' сохранение миниатюры в Jpeg формат с качеством 75%
Dim ep As New EncoderParameters(1)
ep.Param(0) = New EncoderParameter(Encoder.Quality, 75)
Dim myImageCodecInfo As ImageCodecInfo = GetEncoderInfo(ImageFormat.Jpeg)
' сохранение в файл Thumbnail.jpg
bm.Save("Thumbnail.jpg", myImageCodecInfo, ep)
grp.Dispose()
bm.Dispose()
objImage.Dispose()
End If
End Sub
Private Shared Function GetEncoderInfo(ByVal format As ImageFormat) As ImageCodecInfo
Dim j As Integer
Dim encoders() As ImageCodecInfo
encoders = ImageCodecInfo.GetImageEncoders()
j = 0
While j < encoders.Length
If encoders(j).FormatID = format.Guid Then
Return encoders(j)
End If
j += 1
End While
Return Nothing
End Function
End Class