Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: TrashAmbishion en 8 Septiembre 2016, 07:39 am



Título: Duda haciendo resize a una imagen...
Publicado por: TrashAmbishion en 8 Septiembre 2016, 07:39 am
Código
  1.    Private Function Resize_Image(ByVal img As Image, ByVal Width As Int32, ByVal Height As Int32) As Bitmap
  2.        Dim Bitmap_Source As New Bitmap(img)
  3.        Dim Bitmap_Dest As New Bitmap(CInt(Width), CInt(Height))
  4.        Dim Graphic As Graphics = Graphics.FromImage(Bitmap_Dest)
  5.        Graphic.DrawImage(Bitmap_Source, 0, 0, Bitmap_Dest.Width + 1, Bitmap_Dest.Height + 1)
  6.        Return Bitmap_Dest
  7.    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


Título: Re: Duda haciendo resize a una imagen...
Publicado por: Eleкtro en 8 Septiembre 2016, 15:11 pm
Porque 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?.



Pró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
  1. Private Function Resize_Image(ByVal img As Image, ByVal Width As Int32, ByVal Height As Int32) As Bitmap
  2.    Dim Bitmap_Dest As New Bitmap(CInt(Width), CInt(Height))
  3.    Using Graphic As Graphics = Graphics.FromImage(Bitmap_Dest)
  4.        Graphic.DrawImage(img, 0, 0, Bitmap_Dest.Width + 1, Bitmap_Dest.Height + 1)
  5.    End Using
  6.    Return Bitmap_Dest
  7. End Function

tambien 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:

(http://i.imgur.com/UmJ3Adn.png) (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/Bitmap/Resize.vb (https://github.com/ElektroStudios/ElektroKit/blob/master/Solution/Elektro.Imaging/Extensions/Bitmap/Resize.vb)

(http://i.imgur.com/YBqDLbb.png) (https://github.com/ElektroStudios/ElektroKit/blob/master/Solution/Elektro.Imaging/Extensions/Image/Resize.vb)
https://github.com/ElektroStudios/ElektroKit/blob/master/Solution/Elektro.Imaging/Extensions/Image/Resize.vb (https://github.com/ElektroStudios/ElektroKit/blob/master/Solution/Elektro.Imaging/Extensions/Image/Resize.vb)

Código fuente destripado y adaptado:
Código
  1. <HideModuleName>
  2. <DebuggerStepThrough>
  3. Public Module ImagingExtensions
  4.  
  5.    <Extension>
  6.    <EditorBrowsable(EditorBrowsableState.Always)>
  7.    Public Function Resize(ByVal sender As Image, ByVal size As Size) As Image
  8.  
  9.        If (size.Width <= 0) Then
  10.            Throw New ArgumentException(paramName:="width", message:="Value bigger than 0 is reqired.")
  11.  
  12.        ElseIf (size.Height <= 0) Then
  13.            Throw New ArgumentException(paramName:="height", message:="Value bigger than 0 is reqired.")
  14.  
  15.        Else
  16.            Dim bmp As New Bitmap(size.Width, size.Height, sender.PixelFormat)
  17.            Using g As Graphics = Graphics.FromImage(bmp)
  18.                With g
  19.                    .CompositingQuality = CompositingQuality.Default
  20.                    .InterpolationMode = InterpolationMode.Default
  21.                    .PixelOffsetMode = PixelOffsetMode.Default
  22.                    .SmoothingMode = SmoothingMode.Default
  23.                    .DrawImage(sender, 0, 0, bmp.Width, bmp.Height)
  24.                End With
  25.            End Using
  26.            Return bmp
  27.  
  28.        End If
  29.  
  30.    End Function
  31.  
  32.    <Extension>
  33.    <EditorBrowsable(EditorBrowsableState.Always)>
  34.    Public Function Resize(ByVal sender As Image, ByVal percent As Double) As Image
  35.        Dim width As Integer = (sender.Width \ CInt(100 / percent))
  36.        Dim height As Integer = (sender.Height \ CInt(100 / percent))
  37.        Return Resize(sender, New Size(width, height))
  38.    End Function
  39.  
  40.    <Extension>
  41.    <EditorBrowsable(EditorBrowsableState.Always)>
  42.    Public Function Resize(ByVal sender As Bitmap, ByVal size As Size) As Bitmap
  43.        Return DirectCast(Resize(DirectCast(sender, Image), size), Bitmap)
  44.    End Function
  45.  
  46.    <Extension>
  47.    <EditorBrowsable(EditorBrowsableState.Always)>
  48.    Public Function Resize(ByVal sender As Bitmap, ByVal percent As Double) As Bitmap
  49.        Return DirectCast(Resize(DirectCast(sender, Image), percent), Bitmap)
  50.    End Function
  51.  
  52. End Module

Saludos


Título: Re: Duda haciendo resize a una imagen...
Publicado por: TrashAmbishion en 15 Septiembre 2016, 03:40 am
Código
  1. Imports System.Drawing.Drawing2D
  2.  
  3. Public Class Form1
  4.  
  5.    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
  6.  
  7.        Dim Dimensiones As New Size
  8.  
  9.        Dimensiones.Width = 600 : Dimensiones.Height = 400
  10.  
  11.        Resize_Image(Image.FromFile("C:\Fraps\Screenshots\Prueba.bmp"), Dimensiones).Save("C:\Fraps\Screenshots\Prueba1.bmp")
  12.  
  13.    End Sub
  14.  
  15.    Public Function Resize_Image(ByVal sender As Image, ByVal size As Size) As Image
  16.  
  17.        If (size.Width <= 0) Then
  18.            Throw New ArgumentException(paramName:="width", message:="Value bigger than 0 is reqired.")
  19.  
  20.        ElseIf (size.Height <= 0) Then
  21.            Throw New ArgumentException(paramName:="height", message:="Value bigger than 0 is reqired.")
  22.  
  23.        Else
  24.            Dim bmp As New Bitmap(size.Width, size.Height, sender.PixelFormat)
  25.            Using g As Graphics = Graphics.FromImage(bmp)
  26.                With g
  27.                    .CompositingQuality = CompositingQuality.Default
  28.                    .InterpolationMode = InterpolationMode.Default
  29.                    .PixelOffsetMode = PixelOffsetMode.Default
  30.                    .SmoothingMode = SmoothingMode.Default
  31.                    .DrawImage(sender, 0, 0, bmp.Width, bmp.Height)
  32.                End With
  33.            End Using
  34.            Return bmp
  35.  
  36.        End If
  37.  
  38.    End Function
  39.  
  40. 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...


Título: Re: Duda haciendo resize a una imagen...
Publicado por: TrashAmbishion en 15 Septiembre 2016, 03:52 am
Me respondo..

http://stackoverflow.com/questions/2079428/unable-to-delete-image-after-opening-it-in-vb-net-app

El problema es que Image.FromFile mantiene el archivo abierto...

Salu2