Duda haciendo resize a una imagen...

Iniciado por TrashAmbishion, 8 Septiembre 2016, 07:39 AM

0 Miembros y 1 Visitante están viendo este tema.

TrashAmbishion

Código (vbnet) [Seleccionar]
    Private Function Resize_Image(ByVal img As Image, ByVal Width As Int32, ByVal Height As Int32) As Bitmap
        Dim Bitmap_Source As New Bitmap(img)
        Dim Bitmap_Dest As New Bitmap(CInt(Width), CInt(Height))
        Dim Graphic As Graphics = Graphics.FromImage(Bitmap_Dest)
        Graphic.DrawImage(Bitmap_Source, 0, 0, Bitmap_Dest.Width + 1, Bitmap_Dest.Height + 1)
        Return Bitmap_Dest
    End Function


Porque no puedo eliminar la imagen source una vez que termina la operación dice que esta en uso.

Próbe con otros codigos que tengo que usan Using, tambien hize Dispose a cada imagen y nada sigue en uso..

Salu2

Eleкtro

#1
Cita de: TrashAmbishion en  8 Septiembre 2016, 07:39 AMPorque no puedo eliminar la imagen source una vez que termina la operación dice que esta en uso.

No consigo hallar la forma de reproducir el problema que describes, pero es posible que sea por que despues de llamar a la función le estés pasando el Bitmap al constructor de algún type y trates de liberar el Bitmap antes que ese type?.




Cita de: TrashAmbishion en  8 Septiembre 2016, 07:39 AMPróbe con otros codigos que tengo que usan Using

La correcta liberación de objetos de la función que has mostrado sería la siguiente:
Código (vbnet) [Seleccionar]
Private Function Resize_Image(ByVal img As Image, ByVal Width As Int32, ByVal Height As Int32) As Bitmap
   Dim Bitmap_Dest As New Bitmap(CInt(Width), CInt(Height))
   Using Graphic As Graphics = Graphics.FromImage(Bitmap_Dest)
       Graphic.DrawImage(img, 0, 0, Bitmap_Dest.Width + 1, Bitmap_Dest.Height + 1)
   End Using
   Return Bitmap_Dest
End Function


Cita de: TrashAmbishion en  8 Septiembre 2016, 07:39 AMtambien hize Dispose a cada imagen y nada

La declaración e instanciación de Bitmap_Source es innecesaria así que puedes eliminarla del código como hice yo arriba, y la instancia del objeto Bitmap_Dest no debes liberarla puesto que es el objeto que contiene la imagen que será devuelta por la función -.-, deberás liberarla despues de haber llamado a dicha función, es decir cuando ya no necesites usar/mostrar esa imagen, no antes.




( Se que ultimamente no dejo de repetirte lo siguiente de aquí abajo en cada duda que tienes, pero me veo casi obligado a hacerlo puesto que parece que te busques los problemas intencionadamente sin necesidad xD usando esos códigos antiguos y con imperfecciones de diseño, y eso sería algo que puedes evitar de la siguiente forma... )

En mi API gratuita ElektroKit puedes encontrar las siguientes funciones (a modo de extensiones de método) para redimensionar imágenes:


https://github.com/ElektroStudios/ElektroKit/blob/master/Solution/Elektro.Imaging/Extensions/Bitmap/Resize.vb


https://github.com/ElektroStudios/ElektroKit/blob/master/Solution/Elektro.Imaging/Extensions/Image/Resize.vb

Código fuente destripado y adaptado:
Código (vbnet) [Seleccionar]
<HideModuleName>
<DebuggerStepThrough>
Public Module ImagingExtensions

   <Extension>
   <EditorBrowsable(EditorBrowsableState.Always)>
   Public Function Resize(ByVal sender As Image, ByVal size As Size) As Image

       If (size.Width <= 0) Then
           Throw New ArgumentException(paramName:="width", message:="Value bigger than 0 is reqired.")

       ElseIf (size.Height <= 0) Then
           Throw New ArgumentException(paramName:="height", message:="Value bigger than 0 is reqired.")

       Else
           Dim bmp As New Bitmap(size.Width, size.Height, sender.PixelFormat)
           Using g As Graphics = Graphics.FromImage(bmp)
               With g
                   .CompositingQuality = CompositingQuality.Default
                   .InterpolationMode = InterpolationMode.Default
                   .PixelOffsetMode = PixelOffsetMode.Default
                   .SmoothingMode = SmoothingMode.Default
                   .DrawImage(sender, 0, 0, bmp.Width, bmp.Height)
               End With
           End Using
           Return bmp

       End If

   End Function

   <Extension>
   <EditorBrowsable(EditorBrowsableState.Always)>
   Public Function Resize(ByVal sender As Image, ByVal percent As Double) As Image
       Dim width As Integer = (sender.Width \ CInt(100 / percent))
       Dim height As Integer = (sender.Height \ CInt(100 / percent))
       Return Resize(sender, New Size(width, height))
   End Function

   <Extension>
   <EditorBrowsable(EditorBrowsableState.Always)>
   Public Function Resize(ByVal sender As Bitmap, ByVal size As Size) As Bitmap
       Return DirectCast(Resize(DirectCast(sender, Image), size), Bitmap)
   End Function

   <Extension>
   <EditorBrowsable(EditorBrowsableState.Always)>
   Public Function Resize(ByVal sender As Bitmap, ByVal percent As Double) As Bitmap
       Return DirectCast(Resize(DirectCast(sender, Image), percent), Bitmap)
   End Function

End Module


Saludos








TrashAmbishion

#2
Código (vbnet) [Seleccionar]
Imports System.Drawing.Drawing2D

Public Class Form1

   Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

       Dim Dimensiones As New Size

       Dimensiones.Width = 600 : Dimensiones.Height = 400

       Resize_Image(Image.FromFile("C:\Fraps\Screenshots\Prueba.bmp"), Dimensiones).Save("C:\Fraps\Screenshots\Prueba1.bmp")

   End Sub

   Public Function Resize_Image(ByVal sender As Image, ByVal size As Size) As Image

       If (size.Width <= 0) Then
           Throw New ArgumentException(paramName:="width", message:="Value bigger than 0 is reqired.")

       ElseIf (size.Height <= 0) Then
           Throw New ArgumentException(paramName:="height", message:="Value bigger than 0 is reqired.")

       Else
           Dim bmp As New Bitmap(size.Width, size.Height, sender.PixelFormat)
           Using g As Graphics = Graphics.FromImage(bmp)
               With g
                   .CompositingQuality = CompositingQuality.Default
                   .InterpolationMode = InterpolationMode.Default
                   .PixelOffsetMode = PixelOffsetMode.Default
                   .SmoothingMode = SmoothingMode.Default
                   .DrawImage(sender, 0, 0, bmp.Width, bmp.Height)
               End With
           End Using
           Return bmp

       End If

   End Function

End Class


Me sigue diciendo que mi aplicación tiene la imagen en uso, cuando trato de eliminarla.

Salu2 y muchas gracias ya volvi a descargar tus librerias actualizadas...