: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 ?
Sinceramente,
no sabria como hacerlo,
pero si tienes acceso a la imagen,
podrias mandarlo como un archivo normal
salu2
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
tomando la idea de Snort creo que se podría hacer asi:
'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
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:
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...
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
'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
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
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!
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
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...
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:
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:
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
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:
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
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
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
Sip... es preferible mandar byte por byte que pixel por pixel... aunk en el primero aya que guardarlo en la PC