2010-12-08 2 views
1

Моих кодов:Deal (Dispose) с Bitmap и парой при загрузке и изменение размера изображений на сервер VB.net

Public Function HandleImageUpload(ByVal serverPath As String, ByVal iWidth As Integer, ByVal iHeight As Integer) As String 


      Dim fileStream As Stream = imageUploader1.PostedFile.InputStream 
      Dim fileName As String 
      Dim newSize As Size = New Size 
      Dim extension As String 
      Dim imageBytes As Byte() 
      Dim stream As New FileStream(serverPath, FileMode.Create) 

      If imageUploader1.HasFile Then 

       If imageUploader1.FileBytes.Length < 4194304 Then 

        imageBytes = imageUploader1.FileBytes 
        fileName = imageUploader1.FileName 
        extension = Path.GetExtension(fileName) 

        If extension.ToLower = ".png" Or extension.ToLower = ".bmp" _ 
         Or extension.ToLower = ".gif" Or extension.ToLower = ".jpg" Then 

         newSize.Width = iWidth 
         newSize.Height = iHeight 

         imageBytes = ResizeImageFile(fileStream, newSize) 

         stream.Write(imageBytes, 0, imageBytes.Length) 
         'need dispose or hte server will keep it' 
         stream.Dispose() 

        End If 
       End If 
      End If 
    End Function 



    Public Function ResizeImageFile(ByVal fileStream As Stream, ByVal newSize As Size) As Byte() 
     Dim memoryStream As MemoryStream = New MemoryStream 

     Dim oldImage As System.Drawing.Image = System.Drawing.Image.FromStream(fileStream) 


     Dim newImage As Bitmap = New Bitmap(newSize.Width, newSize.Height, PixelFormat.Format24bppRgb) 

     Dim canvas As Graphics = Graphics.FromImage(newImage) 
     canvas.SmoothingMode = SmoothingMode.AntiAlias 
     canvas.InterpolationMode = InterpolationMode.HighQualityBicubic 
     canvas.PixelOffsetMode = PixelOffsetMode.HighQuality 

     canvas.DrawImage(oldImage, New Rectangle(New Point(0, 0), newSize)) 

     'question here' 
     newImage.Save(memoryStream, ImageFormat.Jpeg) 

     'Dispose right?' 
     oldImage.Dispose() 
     canvas.Dispose() 
     newImage.Dispose() 

     Return memoryStream.GetBuffer 
    End Function 


End Class 
  1. После того как я генерировать Bitmap newImage, может ли сохранить его непосредственно на сервер, а не сохранить его в memoryStream
  2. Какой ресурс я должен распоряжаться? что касается шаблона MSDN iDisposable, нам нужно распоряжаться неуправляемым ресурсом. How to dispose managed resource in Dispose() method in C#?. Нужно ли в этом случае задействовать finalizer? я прав?

  3. Могут ли коды улучшиться? например написать на сервер, размер метод и т.д.

С уважением,

ответ

0

1) Да, вы можете и, возможно, должны. MemoryStream - это область временной области, которая нуждается в закрытии.

2) Все, что реализует IDisposable. Вы не называете финализатор, GC делает.

3) Я буду размещать и обновлять на этом

UPDATE

ОК, я имел взгляд, и я думаю, что вам нужно сделать, сохранение внутри метода ResizeImageFile так, что вы создаете FileStream с помощью serverPath внутри HandleImageUpload и передать его методу ResizeImageFile, и при сохранении изображения, а не MemoryStream, вы экономите до FileSTream.

Вы делаете Return memoryStream.GetBuffer, и я уже тестировал и знаю, что это не создаст утечки памяти, в то время как вы фактически не удаляете MemoryStream, но лучше сделать это явно. Хотя новое решение не связано с потоком памяти.

2

Все, что имеет Утилизировать вы хотите позвонить Dispose, когда вы закончите. В идеале вы должны инкапсулировать эти объекты в операторы using. Оператор using вызывает Dispose для вас, когда объект выходит из области видимости.

http://msdn.microsoft.com/en-us/library/htd05whh.aspx

Кратко глядя на код, проблема у вас есть, что если где-нибудь в своих методах исключение выбрасывается, объекты не будут иметь Disposed метод называется. Вы должны по крайней мере обернуть свой код в блок try/catch/finally и поместить метод dispose в блок finally (лучше всего использовать оператор using).

Финализаторы используются в ваших объектах, чтобы убедиться, что когда они уничтожены, ничто случайно не осталось открытым (например, файл). Если все, что вы делаете, это создание объектов внутри методов (без переменных уровня класса, которые вам нужно избавиться), тогда вам не нужно реализовывать Finalizer. Вы никогда не захотите реализовать пользовательский Finalizer, если вам это не нужно, потому что это заставляет GC выполнять дополнительную работу (продвигает объект на следующий уровень GC и не уничтожает его немедленно). Основываясь на том, что вы опубликовали, похоже, что он вам не нужен.

+0

отличная и ясная. – 2010-12-08 13:29:10

+0

sry, забудьте упомянуть, что я удалил обработчик ошибок из этого кода, кажется, если я использую «использование», тогда мне не нужно распоряжаться ресурсом. – 2010-12-08 14:18:11

 Смежные вопросы

  • Нет связанных вопросов^_^