Foro de elhacker.net

Programación => Programación Visual Basic => Mensaje iniciado por: Xephiro en 26 Diciembre 2006, 22:52 pm



Título: Como mandar un picturebox con winsock
Publicado por: Xephiro en 26 Diciembre 2006, 22:52 pm
 :huh: :huh: :huh: Buenas XD aqui yo nuevamente con otra pregunta XD...

Como se puede mandar un picturebox por medio de winsock en un sistema cliente - servidor a otro picturebox ?


Título: Re: Como mandar un picturebox con winsock
Publicado por: DrakoX en 27 Diciembre 2006, 01:23 am
Sinceramente,
no sabria como hacerlo,

pero si tienes acceso a la imagen,
podrias mandarlo como un archivo normal

salu2


Título: Re: Como mandar un picturebox con winsock
Publicado por: Snort en 27 Diciembre 2006, 11:01 am
Tendrias qe guardar la imagen del picturebox en un archivo, y luego mandar el archivo, y al llegar, pon qe si la extension es jpg, bmp, o la qe sea, de imagen, la abra desde el otro picturebox


Título: Re: Como mandar un picturebox con winsock
Publicado por: CeLaYa en 27 Diciembre 2006, 21:34 pm
tomando la idea de Snort creo que se podría hacer asi:

Código:
'Para enviar la imagen lo hago desde un command Button y la guardo en un archivo llamado "x.jpg"

Private Sub Command1_Click()
    Dim x As String, f As Long
    SavePicture Picture1.Picture, "c:\x.jpg"
   
    f = FreeFile
    Open "C:\x.jpg" For Binary Access Read As #f
    x = Space(LOF(f))
    Get #f, , x
    Close #f
   
    winsock1.SendData x
   
End Sub


'Para recibir lo hago con strdata y lo guardo en un archivo "x2.jpg" y luego cargo la imagen en el picture
Private Sub winsock2_DataArrival(ByVal bytesTotal As Long)
    Dim strData As String, f As Long
   
    winsock2.GetData strData
    txtOutput.Text = txtOutput.Text & strData
       
    f = FreeFile
   
    Open "C:\x2.jpg" For Binary Access Write As #f
    Put #f, , txtOutput.Text
    Close #f
    On Local Error Resume Next
    Picture1.Picture = LoadPicture("c:\x2.jpg")
    On Local Error GoTo 0
   
End Sub


Título: Re: Como mandar un picturebox con winsock
Publicado por: CeLaYa en 27 Diciembre 2006, 21:48 pm
he estado probando el código y me surgierón 2 dudas:

1.- ¿Cómo se sabe cuando se ha terminado de enviar todos los datos?, (porque lo que hice fue que se fueran guardando en un archivo los datos como iban llegando) :o

2.- ¿Porque el nuevo archivo no es del mismo tamaño que el original?, casi siempre es mayor y no siempre es del mismo tamaño. :o

 :huh: :huh: alguién sabe  :huh: :huh:


Título: Re: Como mandar un picturebox con winsock
Publicado por: <?BRoWLi?> en 27 Diciembre 2006, 21:54 pm
Deberías enviar por lotes... por ejemplo de 1KB... Dim variable as tipo * 1024... entonces la diferencia se notaría menos (mientras menores sean los lotes mejor...) y para saber cuando acaba... envía primero el tamaño...
 
   nuevaVariable = FileLen "pathdelarchivo"
u..

open...
    nuevaVariable =  input(Lof(canal),
  • canal), si lo has avierto... y a continuación...

...Close

   ws.senddata nuevaVariable

x cierto nuevaVariable es Long...

y luego lo recibes en el dataarrival... if left(buffer, n... y lo igualas a cualquier ProgressBar.. pb.max = buffer...

y lo que te vaya llegando lo vas añadiendo como long a una nueva variable... o simplemente bytesrecibed en pb.value...

suerte...


Título: Re: Como mandar un picturebox con winsock
Publicado por: CeLaYa en 27 Diciembre 2006, 22:48 pm
BRoWLi gracias por tu comentario, modifique un poco el código que puse y quedo así, aver que opinan, porque es la 1a vez que le meto mano al winsock:

Para enviar
Código:

'Aqui le envio el tamaño de la imagen
Private Sub Command1_Click()
    Dim x As String, f As Long
   
    SavePicture Picture1.Picture, "c:\x.jpg"
   
    Tamaño = FileLen("c:\x.jpg")
   
    tcpServer.SendData Str(Tamaño)
   
End Sub

'Espero a que el cliente me conteste que recibio el tamaño de la imagen y ahora si le envio el archivo
Private Sub tcpServer_DataArrival(ByVal bytesTotal As Long)
    Dim strData As String, f As Long, x As String
    tcpServer.GetData strData
    txtOutput.Text = strData
   
    If strData = "RECIBIDO" Then
        f = FreeFile
        Open "C:\x.jpg" For Binary Access Read As #f
        x = Space(LOF(f))
        Get #f, , x
        Close #f
        tcpServer.SendData x
       
        Kill "C:\x.jpg"
    End If
End Sub

Para recibir
Código:
Private Sub tcpClient_DataArrival(ByVal bytesTotal As Long)
    Dim strData As String, f As Long
   
    tcpClient.GetData strData
    'si el max de progress bar es 1 le pongo el tamaño del archivo
    If ProgressBar1.Max = 1 Then
        ProgressBar1.Max = Val(strData)
        ProgressBar1.Value = 0
        tcpClient.SendData "RECIBIDO"
        t = 0
        Exit Sub
    End If
    'aqui voy recibiendo e incrementando el Progressbar
    txtOutput.Text = txtOutput.Text & strData
    ProgressBar1.Value = bytesTotal
    t = t + bytesTotal

    'Cuando ya lo tengo todo creo un archivo y lo cargo al picture
    If ProgressBar1.Max = t Then
       
        f = FreeFile
        Open "C:\x2.jpg" For Binary Access Write As #f
        Put #f, , txtOutput.Text
        Close #f
        Picture1.Picture = LoadPicture("c:\x2.jpg")
        ProgressBar1.Max = 1
        txtOutput.Text = ""
        Kill "C:\x2.jpg"
    End If
   
End Sub



Título: Re: Como mandar un picturebox con winsock
Publicado por: <?BRoWLi?> en 27 Diciembre 2006, 23:20 pm
Muy buen code!

Aunque, no he vsto x ninguna parte lo del flujo de datos, ten encuenta que s el archivo es mayor al real (el que se te crea), el prograssbar no será exacto... aunque está muy bien el code... Un saludo!


Título: Re: Como mandar un picturebox con winsock
Publicado por: DrakoX en 27 Diciembre 2006, 23:46 pm
lindo code,
lo que seria interesante,
seria ver si existe aguna relación
en el incremento del tamaño,
probandolo con diferentes imagenes,
y de esa forma lograr que el progresbar sea mas preciso


salu2


Título: Re: Como mandar un picturebox con winsock
Publicado por: CeLaYa en 27 Diciembre 2006, 23:47 pm
Gracias, referente a lo del tamaño de la imagen creo que no me di a entender, lo que pasa esque la imagen que cargo al picture es de 3.5Kb y cuando le pongo SavePicture me crea un archivo de 23kb, creo que es porque lo manda como bmp, y lo tendría que pasar a jpg, pero bueno de eso ya se ha hablado mucho aqui, igual y me pongo a búscarle...


Título: Re: Como mandar un picturebox con winsock
Publicado por: ~~ en 28 Diciembre 2006, 02:12 am
Yo lo que siempre uso es un interruptor. Me explico  :P
El cliente envia al server el tamaño del archivo, el server lo recibe y manda la orden de que se envie el contenido del archivo a la vez q activa el interruptor (variable booleana) para indicar q todos los datos recibidos a partir de ese momento iran a un string q cuando tenga el mismo tamaño que el del archivo deseado se descargara totalmente en el archivo.
Aki un ejemplo:

Server:
Código:
Private Sub Form_Load()
ws.Close
ws.Connect "127.0.0.1", 2848
End Sub

Private Sub ws_Connect()
ws.SendData "Tam:" & FileLen("C:\Prueba.txt")
End Sub

Private Sub ws_DataArrival(ByVal bytesTotal As Long)
Dim data As String
Dim Send As String
ws.GetData data

If Left(data, 8) = "SendFile" Then
Open "C:\Prueba.txt" For Binary As #1
Send = Space(LOF(1))
Get #1, , Send
Close #1

ws.SendData Send
End If

End Sub

Cliente:
Código:
Dim DataFile As String
Dim LenFile As Long
Dim Envio As Boolean

Private Sub Form_Load()
ws.LocalPort = 2848
ws.Listen
Envio = False
End Sub

Private Sub ws_ConnectionRequest(ByVal requestID As Long)
ws.Close
ws.Accept requestID
End Sub

Private Sub ws_DataArrival(ByVal bytesTotal As Long)
Dim data As String
ws.GetData data

If Envio = True Then
DataFile = DataFile & data
ProgressBar1.Value = Len(DataFile)
If Len(DataFile) = LenFile Then
Open "C:\Prueba2.txt" For Binary As #1
Put #1, , DataFile
Close #1
DataFile = ""
MsgBox "El Fichero se a Enviado Correctamente"
Envio = False
ProgressBar1.Value = 0
End If
End If

If Left(data, 4) = "Tam:" Then
LenFile = Mid(data, 5)
ProgressBar1.Max = LenFile
Envio = True
ws.SendData "SendFile"
End If

1S4ludo


Título: Re: Como mandar un picturebox con winsock
Publicado por: CeLaYa en 28 Diciembre 2006, 02:47 am
ya he encontrado el problema. El problema esque cuando uso la instrucción SavePicture me guarda el archivo como mapa de bits (bmp) y lo que hice es cambiar la imagen de BMP a JPG con una dll que me encontre. la Dll se llama GBITMAP.DLL

y se las dejo para quien la quiera:

http://www.geocities.com/cero780814/GBITMAP.zip

para usarla se hace de la siguiente manera:
Código:

    bitmap.LoadFileBmp ("c:\x.bmp") 'Cargar el archivo bmp
    If bitmap.SaveFileJpg("c:\x.jpg") = 0 Then 0 ' y lo convierte a jpg
        MsgBox "Imposible grabar JPG: " & Name, vbCritical
    End If



Título: Re: Como mandar un picturebox con winsock
Publicado por: ~~ en 28 Diciembre 2006, 10:38 am
Una mejor opcion q esa dll es el modul cJpeg q hace la captura de pantalla y la guarda en Jpg con la opcion de elegir tu mismo la calidad.
Ademas si usas el modulo no tienes q andar suiendo la dll...

1S4ludo


Título: Re: Como mandar un picturebox con winsock
Publicado por: Sancho.Mazorka en 30 Diciembre 2006, 05:03 am
hay una forma que no hay necesidad de mandar ningun archivo pero es un lio barbaro xq requerimos uso de la API getpixel y luego que dibuje pixel x pixel el receptor, es un lio que me hice xq otra alternativa hasta que encontre unos codigos los modifique y empeze a mandar archivos!
Todo un lio....


Sancho.Mazorka    :P


Título: Re: Como mandar un picturebox con winsock
Publicado por: <?BRoWLi?> en 30 Diciembre 2006, 12:24 pm
Sip... es preferible mandar byte por byte que pixel por pixel... aunk en el primero aya que guardarlo en la PC