Autor
|
Tema: Picturebox semitransparente en VB.NET 2010 (Leído 5,429 veces)
|
bybaal
Desconectado
Mensajes: 52
|
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
Mensajes: 9.877
|
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: ''' ---------------------------------------------------------------------------------------------------- ''' <summary> ''' Sets the opacity of an <see cref="Image"/>. ''' </summary> ''' ---------------------------------------------------------------------------------------------------- ''' <example> This is a code example. ''' <code> ''' Dim img As Image = Bitmap.FromFile("C:\File.png").SetOpacity(opacity:=0.5F) ''' </code> ''' </example> ''' ---------------------------------------------------------------------------------------------------- ''' <param name="sender"> ''' The source <see cref="Image"/>. ''' </param> ''' ''' <param name="opacity">T ''' The target opacity level, from <c>0.0</c> to <c>1.0</c>. ''' </param> ''' ---------------------------------------------------------------------------------------------------- ''' <returns> ''' The <see cref="Image"/> with the opacity applied. ''' </returns> ''' ---------------------------------------------------------------------------------------------------- ''' <exception cref="ArgumentOutOfRangeException"> ''' opacity ''' </exception> ''' ---------------------------------------------------------------------------------------------------- <DebuggerStepThrough> Public Function SetOpacity(ByVal sender As Image, ByVal opacity As Single) As Image If (opacity < 0.0F) OrElse (opacity > 1.0F) Then Throw New ArgumentOutOfRangeException(paramName:="opacity") Else Using g As Graphics = Graphics.FromImage(sender) Dim matrix As New ColorMatrix matrix.Matrix33 = opacity Using ia As New ImageAttributes ia.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap) g.DrawImage(sender, New Rectangle(0, 0, sender.Width, sender.Height), 0, 0, sender.Width, sender.Height, GraphicsUnit.Pixel, ia) End Using End Using Return sender End If End Function
Source original: Saludos!
|
|
« Última modificación: 22 Diciembre 2015, 18:33 pm por Eleкtro »
|
En línea
|
|
|
|
bybaal
Desconectado
Mensajes: 52
|
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: ''' ---------------------------------------------------------------------------------------------------- ''' <summary> ''' Sets the opacity of an <see cref="Image"/>. ''' </summary> ''' ---------------------------------------------------------------------------------------------------- ''' <example> This is a code example. ''' <code> ''' Dim img As Image = Bitmap.FromFile("C:\File.png").SetOpacity(opacity:=0.5F) ''' </code> ''' </example> ''' ---------------------------------------------------------------------------------------------------- ''' <param name="sender"> ''' The source <see cref="Image"/>. ''' </param> ''' ''' <param name="opacity">T ''' The target opacity level, from <c>0.0</c> to <c>1.0</c>. ''' </param> ''' ---------------------------------------------------------------------------------------------------- ''' <returns> ''' The <see cref="Image"/> with the opacity applied. ''' </returns> ''' ---------------------------------------------------------------------------------------------------- ''' <exception cref="ArgumentOutOfRangeException"> ''' opacity ''' </exception> ''' ---------------------------------------------------------------------------------------------------- <DebuggerStepThrough> Public Function SetOpacity(ByVal sender As Image, ByVal opacity As Single) As Image If (opacity < 0.0F) OrElse (opacity > 1.0F) Then Throw New ArgumentOutOfRangeException(paramName:="opacity") Else Using g As Graphics = Graphics.FromImage(sender) Dim matrix As New ColorMatrix matrix.Matrix33 = opacity Using ia As New ImageAttributes ia.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap) g.DrawImage(sender, New Rectangle(0, 0, sender.Width, sender.Height), 0, 0, sender.Width, sender.Height, GraphicsUnit.Pixel, ia) End Using End Using Return sender End If End Function
Source original: Saludos!
|
|
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.877
|
Aquí tienes un ejemplo: Imports System.Drawing.Imaging Public NotInheritable Class Form1 : Inherits Form Private srcImg As Image ' Source image. Private tmpImg As Image ' Transparent image. Public Sub New() MyClass.InitializeComponent() Me.srcImg = Bitmap.FromFile("C:\image.bmp") End Sub Private Sub Button1_Click() Handles Button1.Click If (Me.tmpImg IsNot Nothing) Then Me.tmpImg.Dispose() End If Me.tmpImg = Me.SetOpacity(Me.srcImg, 0.25) ' 25% Me.PictureBox1.BackgroundImage = Me.tmpImg End Sub Public Function SetOpacity(ByVal img As Image, ByVal opacity As Single) As Image If (opacity < 0.0F) OrElse (opacity > 1.0F) Then Throw New ArgumentOutOfRangeException(paramName:="opacity") Else Dim bmp As New Bitmap(img.Width, img.Height) Using g As Graphics = Graphics.FromImage(bmp) Dim matrix As New ColorMatrix matrix.Matrix33 = opacity Using ia As New ImageAttributes ia.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap) g.DrawImage(img, New Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel, ia) End Using End Using Return bmp End If End Function End Class
Saludos
|
|
|
En línea
|
|
|
|
bybaal
Desconectado
Mensajes: 52
|
Lo siento mucho, pero la imagen sale completamente sin transparencia, no importa el porciento que se le ponga Aquí tienes un ejemplo: Imports System.Drawing.Imaging Public NotInheritable Class Form1 : Inherits Form Private srcImg As Image ' Source image. Private tmpImg As Image ' Transparent image. Public Sub New() MyClass.InitializeComponent() Me.srcImg = Bitmap.FromFile("C:\image.bmp") End Sub Private Sub Button1_Click() Handles Button1.Click If (Me.tmpImg IsNot Nothing) Then Me.tmpImg.Dispose() End If Me.tmpImg = Me.SetOpacity(Me.srcImg, 0.25) ' 25% Me.PictureBox1.BackgroundImage = Me.tmpImg End Sub Public Function SetOpacity(ByVal img As Image, ByVal opacity As Single) As Image If (opacity < 0.0F) OrElse (opacity > 1.0F) Then Throw New ArgumentOutOfRangeException(paramName:="opacity") Else Dim bmp As New Bitmap(img.Width, img.Height) Using g As Graphics = Graphics.FromImage(bmp) Dim matrix As New ColorMatrix matrix.Matrix33 = opacity Using ia As New ImageAttributes ia.SetColorMatrix(matrix, ColorMatrixFlag.Default, ColorAdjustType.Bitmap) g.DrawImage(img, New Rectangle(0, 0, bmp.Width, bmp.Height), 0, 0, bmp.Width, bmp.Height, GraphicsUnit.Pixel, ia) End Using End Using Return bmp End If End Function End Class
Saludos
|
|
|
En línea
|
|
|
|
Eleкtro
Ex-Staff
Desconectado
Mensajes: 9.877
|
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
Mensajes: 1.263
Be the change you wanna see in te world
|
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: //i, j son las variables iteradoras //pic es el Bitmap con la imagen cargada Color c = pic.GetPixel(i,j);
- Luego crear un tipo Color nuevo con el Alpha que quieras y el color obtenido de la imagen: Color newC = Color.FromArgb(50, c); //50 es el Alpha
- Después setear este nuevo color en el mismo Pixel (i,j): pic.SetPixel(newC, i, j);
- Al terminar de recorrer todos los Píxeles de la imagen: 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-pictureboxSalu2s
|
|
|
En línea
|
|
|
|
bybaal
Desconectado
Mensajes: 52
|
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: //i, j son las variables iteradoras //pic es el Bitmap con la imagen cargada Color c = pic.GetPixel(i,j);
- Luego crear un tipo Color nuevo con el Alpha que quieras y el color obtenido de la imagen: Color newC = Color.FromArgb(50, c); //50 es el Alpha
- Después setear este nuevo color en el mismo Pixel (i,j): pic.SetPixel(newC, i, j);
- Al terminar de recorrer todos los Píxeles de la imagen: 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-pictureboxSalu2s
|
|
|
En línea
|
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
PictureBox
Programación Visual Basic
|
CsarGR
|
3
|
3,188
|
15 Diciembre 2005, 23:34 pm
por NYlOn
|
|
|
Java3d: Textura de cubo en java3D sale semitransparente
Java
|
Nabucodonosor
|
0
|
5,670
|
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
|
27 Junio 2013, 04:05 am
por juanma2468
|
|
|
Picturebox C#
.NET (C#, VB.NET, ASP)
|
MHMC777
|
4
|
9,643
|
10 Noviembre 2014, 19:29 pm
por Eleкtro
|
|
|
PictureBox
Programación C/C++
|
pikoc
|
3
|
2,195
|
15 Julio 2015, 01:02 am
por x64core
|
|