PNG con Visual Basic?

Iniciado por klaususkun, 15 Enero 2008, 02:16 AM

0 Miembros y 1 Visitante están viendo este tema.

klaususkun

Trato de cargar una imagen transparente en un formulario fijo (que no se puede mover del sitio) transparente y sin bordes.

La cuestion es que Visual Basic acepta de serie 3 formatos BMP,JGP y GIF.
Los 2 Primeros no tienen transparencia (el fondo se vuelve blanco si no tiene cuando lo guardas)
Y gif... La transparencia del gif funciona pero si nos metemos en tema de tratado de imagen te daras cuenta que no es una transparecia como tal pero no viene al caso...

La cuestion es que el gif es Caca... la calidad es baja o nula incruso utilizando la mejor calidad de photoshop... En cambio en PNG las imagenes se ven de lujo pero No puedo cargarlas...

Necesito cargar PNG pero PNG con transparencia ya que encontre un ejemplo de cargar PNG y despues la transparencia no la cargaba y tabamos a igual....

UNA Ayudita please!! >_<

LeandroA

hola lo podes hacer con gdi++ pero bueno funciona con windows xp para arriva.

mirate en planet source que hay varios ejemplo

aca te paso un control para mostrar
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=68262&lngWId=1

aca otro

http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=64110&lngWId=1


no estoy muy seguro si es en estos link pero buscate una clase creada por La Volpe que esta muy muy buena que se llama c32bppDIB

Saludos

klaususkun

#2
La verdad esk ya encontre otro pero me he estado peleando para adaptarlo y por eso no lei la contestacion...
El que quiero usar en cuestion es este:
http://www.recursosvisualbasic.com.ar/htm/ocx-componentes-activex-dll/102-modulo-para-leer-png.htm

Usa un modulo y un classmodule y lo llama desde el form (creo la verda esk no he mirado mucho los modulos ya que es mucho codigo y visto k funciona no quiero modificarlo xD)
La cuestion esk el ejemplo tenia un "file" (selector de archivos) y en funcion cual clikes te carga uno o otro en el picturebox.

Lo que quiero es quitar el cuadro ese de selecion y dejar fijo un archivo png k carge en el picturebox pero no caigo k hay que modificar del form ToT

Hoy toy algo tonto u_u


Option Explicit
Dim pngClass As New LoadPNG

Private Sub File1_Click()
If File1.filename <> "" Then
   
    Picture1.Picture = LoadPicture("")
    pngClass.PicBox = Picture1
    pngClass.SetToBkgrnd False, 0, 0  'set to Background (True or false), x and y
    pngClass.BackgroundPicture = Picture1 'same Backgroundpicture
    pngClass.SetAlpha = True 'when Alpha then alpha
    pngClass.SetTrans = True 'when transparent Color then transparent Color
   
   
    ' Visualiza el Archivo en Picture1
    pngClass.OpenPNG File1.Path & "\" & File1.filename
End If
End Sub

Private Sub Picture1_Click()

End Sub


Ese es el codigo del formulario ... que debo modificar para dejarlo estatico es decir k carge la imagen k yo quiera y asi kitar el selector...


EDITO:

Solucionado ^o^


On Error Resume Next
    Picture1.Picture = LoadPicture("")
    pngClass.PicBox = Picture1
    pngClass.SetToBkgrnd False, 0, 0  'set to Background (True or false), x and y
    pngClass.BackgroundPicture = Picture1 'same Backgroundpicture
    pngClass.SetAlpha = True 'when Alpha then alpha
    pngClass.SetTrans = True 'when transparent Color then transparent Color
    pngClass.OpenPNG ("bmp.png")


Ese es el codigo que debo poner para cargar el archivo bmp.png ^o^
Asi que bye bye selector ya puedo usarlo manualmente ^o^

klaususkun

#3
Perdon por hacer Flood xD

La cuestion sigo como al principio ya que tras usar este codigo con los modulos que parecia pintar geial me he dado cuenta de 1 cosa...
Carga el Png hasta aqui bien.
Carga la tranparencia del png hasta aqui tb bien no?

Pero el picturebox tiene un fondo por lo cual sigo teniendo un maldito fondo >_< puedo ponerle el color que quiera que se vera bien ya que la transparencia del png esta bien cargada.

Ahora bien trato de quitar el color de fondo del picture1 y cuando lo hago el color de fondo del picture1 osea "la macro, el cuadro" desaparece ^o^ Pero entonces no se que coño pasa que aparecen pegote negros en el PNG
De manera que al quitar la transparencia a la caja Picture1 no se xk la transparencia del PNG enpieza air mal y no se transparenta todo y se crea una linea negro y muchos manchones alrededor de la imagen ToT

Tienen idea de xk? Le pongo todo mi codigo (es corto) x si quereis analizarlo lo digo... Xk no encuentro el fallo :S



Const LWA_COLORKEY = &H1
Const GWL_EXSTYLE = (-20)
Const WS_EX_LAYERED = &H80000

Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function SetLayeredWindowAttributes Lib "user32.dll" (ByVal hWnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long

Dim pngClass As New LoadPNG

Private Sub Form_Load()
Shape Me, &H0& 'Quita el color de Fondo del Form
CallByName Me, "Character", VbMethod ' Mostramos el PNG
End Sub

Private Sub Shape(Frm As Form, Color As Long)
Frm.BackColor = Color
Dim Ret As Long
Ret = GetWindowLong(Me.hWnd, GWL_EXSTYLE)
Ret = Ret Or WS_EX_LAYERED
SetWindowLong Me.hWnd, GWL_EXSTYLE, Ret
SetLayeredWindowAttributes Me.hWnd, Color, 0, LWA_COLORKEY
End Sub

Function Character()
On Error Resume Next
    ' cuando uso la linea "Picture1.backcolor = Transparent" enpieza a ir mal :S
    ' Tb he notado que si cambio el color manualmente del Picture 1 a Negro sucede lo mismo.
    'Picture1.BackColor = Transparent
    Picture1.Picture = LoadPicture("")
    pngClass.PicBox = Picture1
    pngClass.SetToBkgrnd False, 0, 0  'set to Background (True or false), x and y
    pngClass.BackgroundPicture = Picture1 'same Backgroundpicture
    pngClass.SetAlpha = True 'when Alpha then alpha
    pngClass.SetTrans = True 'when transparent Color then transparent Color
    pngClass.OpenPNG ("LuckyStar - Mikolu.png")
End Function


Aclaraciones:
El Form solo tiene un PictureBox llamado "Picture1".
Uso dos librerias (Un Module y un ClassModule) que pertenecen al ejemplo que puse antes de RecursosVisualBasic
La imagen se llama "LuckyStar - Mikolu.png"


¿Puede ser posible que el problema este en el "Picture1.BackColor = Transparent" y que el transparent no transparente sino que lo vuelva negro (black) ya que si fuera esto tendria algo de sentido ya que el "private sub SHAPE" que uso para dar transparencia al form trata de transparentar fondos negros (¿?WTF¿?)

Saben algunamanera de dar transparencia al Picture1 que no sea la que haya usado yo?

LeandroA

#4
Hola ya ve lo que quieres hacer, vos queres crear un skin con un png al estilo widget, pero bueno de la forma que estas haciendo no te va a funcionar ya que al dibujar el png sobre un control este se difumia y al utilizar SetLayeredWindowAttributes  este no tomo como color de mascara esa difuminacion, la forma de hacerlo es creando un   rederizado sobre un DC abstracto y utilzar UpdateLayeredWindow, pero bueno para hacertela mas corta te paso una clase muy buena que utiliza como te mencione antes c32bppDIB y la clase en si se llama widget-library es de Cobein, (un usuario de esta web.)

fijate que hay muchos ejemplos de como utilizarla

http://www.recursosvisualbasic.com.ar/foro/widget-library-b16.0/

mirate un par de links y vas a ver.
te paso un screen shot







invito tambien a todos aquellos que quieran sumarce con este proyecto. y crear sus propios gadget