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.
Cita de: bybaal en 22 Diciembre 2015, 17:23 PMlo 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:
- ElektroKit/Elektro.Imaging/Extensions/ImageExtensions.vb (https://github.com/ElektroStudios/ElektroKit/blob/master/Elektro.Imaging/Extensions/ImageExtensions.vb)
- ElektroKit/Elektro.Imaging/Extensions/BitmapExtensions.vb (https://github.com/ElektroStudios/ElektroKit/blob/master/Elektro.Imaging/Extensions/BitmapExtensions.vb)
Saludos!
Discúlpame, pero no queda muy claro los dos primeros pasos si pudiera ejemplificar un poco, sería magnifico.
Gracias
Cita de: Eleкtro en 22 Diciembre 2015, 18:15 PM
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:
- ElektroKit/Elektro.Imaging/Extensions/ImageExtensions.vb (https://github.com/ElektroStudios/ElektroKit/blob/master/Elektro.Imaging/Extensions/ImageExtensions.vb)
- ElektroKit/Elektro.Imaging/Extensions/BitmapExtensions.vb (https://github.com/ElektroStudios/ElektroKit/blob/master/Elektro.Imaging/Extensions/BitmapExtensions.vb)
Saludos!
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
Lo siento mucho, pero la imagen sale completamente sin transparencia, no importa el porciento que se le ponga
Cita de: Eleкtro en 22 Diciembre 2015, 21:04 PM
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
Cita de: bybaal en 22 Diciembre 2015, 22:14 PMLo 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!
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-picturebox
Salu2s
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
Cita de: DarK_FirefoX 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:
//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-picturebox
Salu2s