Изменение размера изображения в VB.NET - PullRequest
1 голос
/ 08 декабря 2011

В моем IHttpHandler есть следующий код:

            Dim MemoryStream1 As New System.IO.MemoryStream

            MemoryStream1.Write(SqlDataReader1("cover"), 0, SqlDataReader1("cover").Length - 1)

            Dim Bitmap1 As System.Drawing.Bitmap = System.Drawing.Bitmap.FromStream(MemoryStream1)

            Dim Width1 As Integer = Bitmap1.Width
            Dim Height1 As Integer = Bitmap1.Height

            Dim Width2 As Integer = 90
            Dim Height2 As Integer = Height1 * Width1 / Width1

            Dim Bitmap2 As System.Drawing.Bitmap = New System.Drawing.Bitmap(Width2, Height2)

            Dim Graphics1 As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(Bitmap2)

            Graphics1.DrawImage(Bitmap1, 0, 0, Width2, Height2)

            Dim MemoryStream2 As New System.IO.MemoryStream

            Bitmap2.Save(MemoryStream2, System.Drawing.Imaging.ImageFormat.Png)

            context.Response.BinaryWrite(MemoryStream2.ToArray)

Это работает, но я не уверен, что это правильный способ изменить размер изображения. Как упростить этот код?

Заранее спасибо!

Ответы [ 2 ]

3 голосов
/ 08 декабря 2011
Public Function ResizeImage(imgToResize As Image, size As Size) As Byte()
        Dim sourceWidth As Integer = imgToResize.Width
        Dim sourceHeight As Integer = imgToResize.Height

        Dim nPercent As Single = 0
        Dim nPercentW As Single = 0
        Dim nPercentH As Single = 0

        nPercentW = (CSng(size.Width) / CSng(sourceWidth))
        nPercentH = (CSng(size.Height) / CSng(sourceHeight))

        If nPercentH < nPercentW Then
            nPercent = nPercentH
        Else
            nPercent = nPercentW
        End If

        Dim destWidth As Integer = CInt(Math.Truncate(sourceWidth * nPercent))
        Dim destHeight As Integer = CInt(Math.Truncate(sourceHeight * nPercent))

        Dim b As New Bitmap(destWidth, destHeight)
        Dim g As Graphics = Graphics.FromImage(DirectCast(b, Image))
        g.InterpolationMode = InterpolationMode.HighQualityBicubic

        g.DrawImage(imgToResize, 0, 0, destWidth, destHeight)
        g.Dispose()

        Return b.ToByteArray()
    End Function

Эта функция изменяет размер изображения до указанного размера, сохраняя его пропорции. Это было в C #, и я поставил его через онлайн-конвертер, поэтому может быть не на 100% правильным

ToByteArray () - это метод расширения, который я написал для хранения изображения в БД, я могу дать вам это также, если хотите.

2 голосов
/ 08 декабря 2011

В основном код правильный, но с ним есть некоторые проблемы:

  • Вы пропускаете последний байт при записи в первый поток памяти. Последнее свойство в вызове Write должно быть длиной, а не длиной минус один.
  • Ваш расчет Height2 неверен. Выражение Height1 * Width1 / Width1 всегда будет иметь значение Height1. Вы должны использовать Height1 * Width2 / Width1 вместо.
  • Вы не избавляетесь от потоков памяти, растровых изображений или графических объектов. Используйте блоки Using, чтобы убедиться, что объекты расположены.

Вы можете несколько упростить код, создав первый поток памяти из байтового массива вместо записи массива в поток:

Using MemoryStream1 As New System.IO.MemoryStream(SqlDataReader1("cover"))

  Using Bitmap1 As System.Drawing.Bitmap = System.Drawing.Bitmap.FromStream(MemoryStream1)

    Dim Width1 As Integer = Bitmap1.Width
    Dim Height1 As Integer = Bitmap1.Height

    Dim Width2 As Integer = 90
    Dim Height2 As Integer = Height1 * Width2 / Width1

    Using Bitmap2 As System.Drawing.Bitmap = New System.Drawing.Bitmap(Width2, Height2)

      Using Graphics1 As System.Drawing.Graphics = System.Drawing.Graphics.FromImage(Bitmap2)

        Graphics1.DrawImage(Bitmap1, 0, 0, Width2, Height2)

      End Using

      Using MemoryStream2 As New System.IO.MemoryStream

        Bitmap2.Save(MemoryStream2, System.Drawing.Imaging.ImageFormat.Png)

        context.Response.BinaryWrite(MemoryStream2.ToArray)

      End Using

    End Using

  End Using

End Using
...