Web Developer
ASP.NET, Visual Basic.NET, C#, TSQL, HTML, CSS, PHP, JavaScript, WordPress, WooCommerce
Windows Server, Internet Information Server, SQL Server, Hyper-V

Получение качественной миниатюры изображения в ASP.NET

У платформы .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
Share

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *