Ich hab mich mit dem Thema und dem oben genannten Link nochmal weiter beschäftigt und versucht, ein JPEG, welches sich in einem Image befindet, zu versenden (also kein gespeichertes).
Doch selbst das funktioniert nicht...
Hier der Quelltext:
Delphi-Quellcode:
procedure TForm1.Button2Click(Sender: TObject);
var
jpg: TJPEGImage;
begin
jpg:=TJPEGImage.Create;
jpg.Assign(form1.Image2.Picture.Bitmap);
jpg.SaveToStream(sM);
sM.Position:=0;
try
ClientSocket1.Socket.SendText(IntToStr(sM.Size));
finally
jpg.Free;
end;
end;
procedure TForm1.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
rL: Integer;
jPic: TJPEGImage;
begin
rL := Socket.ReceiveLength; // rL die Größe der empfangen Daten zuweisen
If rL = 0 then Exit; // Es kann sein das nix ankommt, das wäre schlecht ;)
If Rec then
begin // Wenn im Receive-Mode:
Socket.ReceiveBuf(Pointer(Int64(rM.Memory) + rM.Position)^, rL);
rM.Position := rM.Position + rL; // Position setzen
If rM.Position = rSize then // Wenn Datei vollständig:
begin
rM.Position := 0; // Position auf Null setzen, WICHTIG!
jPic := TJPEGImage.Create; // JPEG-Bild erzeugen
try
jPic.LoadFromStream(rM); // Bild vom Stream laden
Image1.Picture.Assign(jPic); // Bild in das Image1 laden
finally
jPic.Free; // JPEG-Bild wieder fregeben
end;
rM.Clear; // Stream leeren
Label1.Caption := 'Übertragung fertig';
Rec := False; // aus den Receive-Mode gehen
end;
end else begin
rSize := StrToInt(Socket.ReceiveText); // rSize die Größe der Datei zuweißen
rM.SetSize(rSize); // Speicher reservieren
rM.Position := 0; // Position auf Null setzen
Rec := True; // Auf Receive-Mode stellen
Socket.SendText('ok'); // Bestätigung senden
end;
end;
procedure TForm1.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
begin
If Socket.ReceiveText = 'ok' then Socket.SendBuf(sM.Memory^, sM.Size);
end;