elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Duda haciendo resize a una imagen...
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Duda haciendo resize a una imagen...  (Leído 2,423 veces)
TrashAmbishion


Desconectado Desconectado

Mensajes: 756


Ver Perfil
Duda haciendo resize a una imagen...
« 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


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.885



Ver Perfil
Re: Duda haciendo resize a una imagen...
« Respuesta #1 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:


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


« Última modificación: 8 Septiembre 2016, 15:27 pm por Eleкtro » En línea



TrashAmbishion


Desconectado Desconectado

Mensajes: 756


Ver Perfil
Re: Duda haciendo resize a una imagen...
« Respuesta #2 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...
« Última modificación: 15 Septiembre 2016, 03:43 am por TrashAmbishion » En línea

TrashAmbishion


Desconectado Desconectado

Mensajes: 756


Ver Perfil
Re: Duda haciendo resize a una imagen...
« Respuesta #3 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
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
[DUDA] Resize
Programación Visual Basic
HJZR4 2 1,724 Último mensaje 12 Diciembre 2007, 06:43 am
por cobein
Duda haciendo un crypter
Programación Visual Basic
aaronduran2 7 3,263 Último mensaje 27 Septiembre 2008, 13:25 pm
por aaronduran2
(DUDA) Haciendo SQL Injection. « 1 2 »
Nivel Web
flowskull 16 9,876 Último mensaje 1 Abril 2012, 23:57 pm
por afdlkglfgfdgfhgf
Haciendo fusión de imagen con CImg/OpenCV « 1 2 »
Programación C/C++
Superplay 15 9,400 Último mensaje 24 Marzo 2014, 13:05 pm
por Superplay
Duda de Red haciendo PenTesting con máquinas virtuales.
Hacking
NikNitro! 2 2,947 Último mensaje 11 Abril 2014, 20:28 pm
por NikNitro!
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines