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)
| | | |-+  Picturebox semitransparente en VB.NET 2010
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Picturebox semitransparente en VB.NET 2010  (Leído 5,429 veces)
bybaal

Desconectado Desconectado

Mensajes: 52


Ver Perfil
Picturebox semitransparente en VB.NET 2010
« en: 22 Diciembre 2015, 17:23 pm »

Hola a todos, necesito ayuda para lograr poner un picturebox semitransparente, no me refiero a un png o gif con fondo transparente , lo que necesito es una imagen, por ejemplo un cuadrado azul, que se vea un 25% transparente y poder cambiar el valor de transparencia en tiempo de ejecución.

Gracias por la ayuda de los que puedan.


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.877



Ver Perfil
Re: Picturebox semitransparente en VB.NET 2010
« Respuesta #1 en: 22 Diciembre 2015, 18:15 pm »

lo que necesito es una imagen, por ejemplo un cuadrado azul, que se vea un 25% transparente y poder cambiar el valor de transparencia en tiempo de ejecución.

Creo que te refieres a lo siguiente, y te sugiero hacerlo de la siguiente manera:

1. Mantener una referencia a la imagen original, opaca.
2. Crear una copia de la imagen opaca, con la transparencia deseada;
    cada vez que quieras modificar la transparencia haces una copia de la imagen opaca, y liberas los recursos de la copia semi-transparente anterior.

Código sacado de mi framework y modificado un poco a las circunstancias:
Código
  1. ''' ----------------------------------------------------------------------------------------------------
  2. ''' <summary>
  3. ''' Sets the opacity of an <see cref="Image"/>.
  4. ''' </summary>
  5. ''' ----------------------------------------------------------------------------------------------------
  6. ''' <example> This is a code example.
  7. ''' <code>
  8. ''' Dim img As Image = Bitmap.FromFile("C:\File.png").SetOpacity(opacity:=0.5F)
  9. ''' </code>
  10. ''' </example>
  11. ''' ----------------------------------------------------------------------------------------------------
  12. ''' <param name="sender">
  13. ''' The source <see cref="Image"/>.
  14. ''' </param>
  15. '''
  16. ''' <param name="opacity">T
  17. ''' The target opacity level, from <c>0.0</c> to <c>1.0</c>.
  18. ''' </param>
  19. ''' ----------------------------------------------------------------------------------------------------
  20. ''' <returns>
  21. ''' The <see cref="Image"/> with the opacity applied.
  22. ''' </returns>
  23. ''' ----------------------------------------------------------------------------------------------------
  24. ''' <exception cref="ArgumentOutOfRangeException">
  25. ''' opacity
  26. ''' </exception>
  27. ''' ----------------------------------------------------------------------------------------------------
  28. <DebuggerStepThrough>
  29. Public Function SetOpacity(ByVal sender As Image, ByVal opacity As Single) As Image
  30.  
  31.    If (opacity < 0.0F) OrElse (opacity > 1.0F) Then
  32.        Throw New ArgumentOutOfRangeException(paramName:="opacity")
  33.  
  34.    Else
  35.        Using g As Graphics = Graphics.FromImage(sender)
  36.  
  37.            Dim matrix As New ColorMatrix
  38.            matrix.Matrix33 = opacity
  39.  
  40.            Using ia As New ImageAttributes
  41.  
  42.                ia.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap)
  43.                g.DrawImage(sender, New Rectangle(0, 0, sender.Width, sender.Height), 0, 0, sender.Width, sender.Height, GraphicsUnit.Pixel, ia)
  44.  
  45.            End Using
  46.  
  47.        End Using
  48.  
  49.        Return sender
  50.  
  51.    End If
  52.  
  53. End Function

Source original:

Saludos!


« Última modificación: 22 Diciembre 2015, 18:33 pm por Eleкtro » En línea



bybaal

Desconectado Desconectado

Mensajes: 52


Ver Perfil
Re: Picturebox semitransparente en VB.NET 2010
« Respuesta #2 en: 22 Diciembre 2015, 19:53 pm »

Discúlpame, pero no queda muy claro los dos primeros pasos si pudiera ejemplificar un poco, sería magnifico.

Gracias

Creo que te refieres a lo siguiente, y te sugiero hacerlo de la siguiente manera:

1. Mantener una referencia a la imagen original, opaca.
2. Crear una copia de la imagen opaca, con la transparencia deseada;
    cada vez que quieras modificar la transparencia haces una copia de la imagen opaca, y liberas los recursos de la copia semi-transparente anterior.

Código sacado de mi framework y modificado un poco a las circunstancias:
Código
  1. ''' ----------------------------------------------------------------------------------------------------
  2. ''' <summary>
  3. ''' Sets the opacity of an <see cref="Image"/>.
  4. ''' </summary>
  5. ''' ----------------------------------------------------------------------------------------------------
  6. ''' <example> This is a code example.
  7. ''' <code>
  8. ''' Dim img As Image = Bitmap.FromFile("C:\File.png").SetOpacity(opacity:=0.5F)
  9. ''' </code>
  10. ''' </example>
  11. ''' ----------------------------------------------------------------------------------------------------
  12. ''' <param name="sender">
  13. ''' The source <see cref="Image"/>.
  14. ''' </param>
  15. '''
  16. ''' <param name="opacity">T
  17. ''' The target opacity level, from <c>0.0</c> to <c>1.0</c>.
  18. ''' </param>
  19. ''' ----------------------------------------------------------------------------------------------------
  20. ''' <returns>
  21. ''' The <see cref="Image"/> with the opacity applied.
  22. ''' </returns>
  23. ''' ----------------------------------------------------------------------------------------------------
  24. ''' <exception cref="ArgumentOutOfRangeException">
  25. ''' opacity
  26. ''' </exception>
  27. ''' ----------------------------------------------------------------------------------------------------
  28. <DebuggerStepThrough>
  29. Public Function SetOpacity(ByVal sender As Image, ByVal opacity As Single) As Image
  30.  
  31.    If (opacity < 0.0F) OrElse (opacity > 1.0F) Then
  32.        Throw New ArgumentOutOfRangeException(paramName:="opacity")
  33.  
  34.    Else
  35.        Using g As Graphics = Graphics.FromImage(sender)
  36.  
  37.            Dim matrix As New ColorMatrix
  38.            matrix.Matrix33 = opacity
  39.  
  40.            Using ia As New ImageAttributes
  41.  
  42.                ia.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap)
  43.                g.DrawImage(sender, New Rectangle(0, 0, sender.Width, sender.Height), 0, 0, sender.Width, sender.Height, GraphicsUnit.Pixel, ia)
  44.  
  45.            End Using
  46.  
  47.        End Using
  48.  
  49.        Return sender
  50.  
  51.    End If
  52.  
  53. End Function

Source original:

Saludos!

En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.877



Ver Perfil
Re: Picturebox semitransparente en VB.NET 2010
« Respuesta #3 en: 22 Diciembre 2015, 21:04 pm »

Aquí tienes un ejemplo:

Código
  1. Imports System.Drawing.Imaging
  2.  
  3. Public NotInheritable Class Form1 : Inherits Form
  4.  
  5.    Private srcImg As Image ' Source image.
  6.    Private tmpImg As Image ' Transparent image.
  7.  
  8.    Public Sub New()
  9.        MyClass.InitializeComponent()
  10.        Me.srcImg = Bitmap.FromFile("C:\image.bmp")
  11.    End Sub
  12.  
  13.    Private Sub Button1_Click() Handles Button1.Click
  14.  
  15.        If (Me.tmpImg IsNot Nothing) Then
  16.            Me.tmpImg.Dispose()
  17.        End If
  18.  
  19.        Me.tmpImg = Me.SetOpacity(Me.srcImg, 0.25) ' 25%
  20.        Me.PictureBox1.BackgroundImage = Me.tmpImg
  21.  
  22.    End Sub
  23.  
  24.    Public Function SetOpacity(ByVal img As Image, ByVal opacity As Single) As Image
  25.  
  26.        If (opacity < 0.0F) OrElse (opacity > 1.0F) Then
  27.            Throw New ArgumentOutOfRangeException(paramName:="opacity")
  28.  
  29.        Else
  30.            Dim bmp As New Bitmap(img.Width, img.Height)
  31.  
  32.            Using g As Graphics = Graphics.FromImage(bmp)
  33.  
  34.                Dim matrix As New ColorMatrix
  35.                matrix.Matrix33 = opacity
  36.  
  37.                Using ia As New ImageAttributes
  38.  
  39.                    ia.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap)
  40.                    g.DrawImage(img, New Rectangle(0, 0, bmp.Width, bmp.Height),
  41.                                0, 0, bmp.Width, bmp.Height,
  42.                                GraphicsUnit.Pixel, ia)
  43.  
  44.                End Using
  45.  
  46.            End Using
  47.  
  48.            Return bmp
  49.  
  50.        End If
  51.  
  52.    End Function
  53.  
  54. End Class
  55.  

Saludos
En línea



bybaal

Desconectado Desconectado

Mensajes: 52


Ver Perfil
Re: Picturebox semitransparente en VB.NET 2010
« Respuesta #4 en: 22 Diciembre 2015, 22:14 pm »

Lo siento mucho, pero la imagen sale completamente sin transparencia, no importa el porciento que se le ponga

Aquí tienes un ejemplo:

Código
  1. Imports System.Drawing.Imaging
  2.  
  3. Public NotInheritable Class Form1 : Inherits Form
  4.  
  5.    Private srcImg As Image ' Source image.
  6.    Private tmpImg As Image ' Transparent image.
  7.  
  8.    Public Sub New()
  9.        MyClass.InitializeComponent()
  10.        Me.srcImg = Bitmap.FromFile("C:\image.bmp")
  11.    End Sub
  12.  
  13.    Private Sub Button1_Click() Handles Button1.Click
  14.  
  15.        If (Me.tmpImg IsNot Nothing) Then
  16.            Me.tmpImg.Dispose()
  17.        End If
  18.  
  19.        Me.tmpImg = Me.SetOpacity(Me.srcImg, 0.25) ' 25%
  20.        Me.PictureBox1.BackgroundImage = Me.tmpImg
  21.  
  22.    End Sub
  23.  
  24.    Public Function SetOpacity(ByVal img As Image, ByVal opacity As Single) As Image
  25.  
  26.        If (opacity < 0.0F) OrElse (opacity > 1.0F) Then
  27.            Throw New ArgumentOutOfRangeException(paramName:="opacity")
  28.  
  29.        Else
  30.            Dim bmp As New Bitmap(img.Width, img.Height)
  31.  
  32.            Using g As Graphics = Graphics.FromImage(bmp)
  33.  
  34.                Dim matrix As New ColorMatrix
  35.                matrix.Matrix33 = opacity
  36.  
  37.                Using ia As New ImageAttributes
  38.  
  39.                    ia.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap)
  40.                    g.DrawImage(img, New Rectangle(0, 0, bmp.Width, bmp.Height),
  41.                                0, 0, bmp.Width, bmp.Height,
  42.                                GraphicsUnit.Pixel, ia)
  43.  
  44.                End Using
  45.  
  46.            End Using
  47.  
  48.            Return bmp
  49.  
  50.        End If
  51.  
  52.    End Function
  53.  
  54. End Class
  55.  

Saludos
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.877



Ver Perfil
Re: Picturebox semitransparente en VB.NET 2010
« Respuesta #5 en: 23 Diciembre 2015, 00:29 am »

Lo siento mucho, pero la imagen sale completamente sin transparencia, no importa el porciento que se le ponga

Hasta donde lo probé funcionó correctamente. ¿Puedes mostrar la imagen en cuestión o especificar los detalles técnicos del formato de imagen que tiene?.

Saludos!
En línea



DarK_FirefoX


Desconectado Desconectado

Mensajes: 1.263


Be the change you wanna see in te world


Ver Perfil
Re: Picturebox semitransparente en VB.NET 2010
« Respuesta #6 en: 23 Diciembre 2015, 15:34 pm »

Una solución medio brute-force es:

- Cargar la imagen en un tipo Bitmap

- Recorrer cada Pixel de la imagen con dos for (anidados)

- Obtener el Color que tiene el pixel y almacenarlo en un tipo Color. Utilizando:

Código
  1. //i, j son las variables iteradoras
  2. //pic es el Bitmap con la imagen cargada
  3. Color c = pic.GetPixel(i,j);

- Luego crear un tipo Color nuevo con el Alpha que quieras y el color obtenido de la imagen:

Código
  1. Color newC = Color.FromArgb(50, c); //50 es el Alpha

- Después setear este nuevo color en el mismo Pixel (i,j):

Código
  1. pic.SetPixel(newC, i, j);

- Al terminar de recorrer todos los Píxeles de la imagen:

Código
  1. pictureBox.Image = pic;



Si lo que te dijo @Eleкtro no te funciona, debe haber algo raro, responde sus preguntas. De todas formas revisa este link. Aquí utilizan el mismo código de @Eleкtro y le dan solución. Quizás te sirva de algo:

http://stackoverflow.com/questions/24817235/change-opacity-in-picturebox

Salu2s
En línea

bybaal

Desconectado Desconectado

Mensajes: 52


Ver Perfil
Re: Picturebox semitransparente en VB.NET 2010
« Respuesta #7 en: 24 Diciembre 2015, 17:02 pm »

Disculpen la demora, el trabajo me impidió responder mas rápido.

El código de este enlace fue el que funcionó perfectamente, muchísimas gracias a todos

http://stackoverflow.com/questions/24817235/change-opacity-in-picturebox

    Public Shared Function ChangeOpacity(ByVal img As Image, ByVal opacityvalue As Single) As Bitmap
        Dim bmp As New Bitmap(img.Width, img.Height)
        Dim graphics__1 As Graphics = Graphics.FromImage(bmp)
        Dim colormatrix As New colormatrix
        colormatrix.Matrix33 = opacityvalue
        Dim imgAttribute As New ImageAttributes
        imgAttribute.SetColorMatrix(colormatrix, ColorMatrixFlag.[Default], ColorAdjustType.Bitmap)
        graphics__1.DrawImage(img, New Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, img.Width, img.Height, _
         GraphicsUnit.Pixel, imgAttribute)
        graphics__1.Dispose()
        Return bmp
    End Function

Una solución medio brute-force es:

- Cargar la imagen en un tipo Bitmap

- Recorrer cada Pixel de la imagen con dos for (anidados)

- Obtener el Color que tiene el pixel y almacenarlo en un tipo Color. Utilizando:

Código
  1. //i, j son las variables iteradoras
  2. //pic es el Bitmap con la imagen cargada
  3. Color c = pic.GetPixel(i,j);

- Luego crear un tipo Color nuevo con el Alpha que quieras y el color obtenido de la imagen:

Código
  1. Color newC = Color.FromArgb(50, c); //50 es el Alpha

- Después setear este nuevo color en el mismo Pixel (i,j):

Código
  1. pic.SetPixel(newC, i, j);

- Al terminar de recorrer todos los Píxeles de la imagen:

Código
  1. pictureBox.Image = pic;



Si lo que te dijo @Eleкtro no te funciona, debe haber algo raro, responde sus preguntas. De todas formas revisa este link. Aquí utilizan el mismo código de @Eleкtro y le dan solución. Quizás te sirva de algo:

http://stackoverflow.com/questions/24817235/change-opacity-in-picturebox

Salu2s
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
PictureBox
Programación Visual Basic
CsarGR 3 3,188 Último mensaje 15 Diciembre 2005, 23:34 pm
por NYlOn
Java3d: Textura de cubo en java3D sale semitransparente
Java
Nabucodonosor 0 5,670 Último mensaje 20 Mayo 2010, 00:47 am
por Nabucodonosor
Como escalar una imagen dentro de un PictureBox en Visual Studio 2010
.NET (C#, VB.NET, ASP)
juanma2468 2 5,551 Último mensaje 27 Junio 2013, 04:05 am
por juanma2468
Picturebox C#
.NET (C#, VB.NET, ASP)
MHMC777 4 9,643 Último mensaje 10 Noviembre 2014, 19:29 pm
por Eleкtro
PictureBox
Programación C/C++
pikoc 3 2,195 Último mensaje 15 Julio 2015, 01:02 am
por x64core
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines