Som*_*ody -1 delphi image stream transfer
Delphi 2010
我通过自定义TCP套接字控件传输图像使用UTF-8
客户端
var
TSS: TStringStream;
STR :String;
JPG:TJPEGImage;
BMP:TBitmap;
begin
Try
BMP.LoadFromFile('C:\1.bmp');
JPG.Assign(BMP);
JPG.CompressionQuality:=80;
JPG.Compress;
TSS:=TStringStream.Create;
JPG.SaveToStream(TSS);
STR:=TSS.DataString;
MyTCPSocket.SendString(STR);
finally
BMP.free;
JPG.free;
TSS.free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
服务器端
Var
TSS: TStringStream;
TSS:=TStringStream.Create;
TSS.WriteString(STR);
TSS.SaveToFile('C:\2.jpg');
Run Code Online (Sandbox Code Playgroud)
这段代码在同一台PC上运行很棒.
当我将图像发送到使用不同编码的其他PC接收图像但我在数据中看到许多错误字符"?????"时的问题
我认为当TStringStream将字节写入文件时,它无法将unicode字符转换为字节,因此它看起来像"?"
任何想法都非常感谢
您正在尝试发送二进制数据,就好像它是UTF-8编码的文本一样. 它不是,所以不要试图这样做!以原始二进制形式发送二进制数据,例如:
var
MS: TMemoryStream;
JPG: TJPEGImage;
BMP: TBitmap;
begin
MS := TMemoryStream.Create;
try
JPG := TJPEGImage.Create;
try
BMP := TBitmap.Create;
try
BMP.LoadFromFile('C:\1.bmp');
JPG.Assign(BMP);
finally
BMP.Free;
end;
JPG.CompressionQuality := 80;
JPG.Compress;
JPG.SaveToStream(MS);
finally
JPG.Free;
end;
MS.Position := 0;
MyTCPSocket.SendStream(MS);
finally
MS.free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
var
MS: TMemoryStream;
begin
MS := TMemoryStream.Create;
try
MyTCPSocket.ReadStream(MS);
MS.Position := 0;
MS.SaveToFile('C:\2.jpg');
finally
MS.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)
如果必须将二进制数据作为文本发送,则需要使用真正的二进制到文本编码算法对数据进行编码,例如base64或yEnc,而不是 UTF-8(仅用于编码Unicode文本,而不是二进制数据) ,例如:
// TIdEncoderMIME and TIdDecoderMIME are part of Indy,
// which ships with Delphi, but you can use whatever
// you want...
Run Code Online (Sandbox Code Playgroud)
uses
..., IdCoderMIME;
var
S: String;
MS: TMemoryStream;
JPG: TJPEGImage;
BMP: TBitmap;
begin
MS := TMemoryStream.Create;
try
JPG := TJPEGImage.Create;
try
BMP := TBitmap.Create;
try
BMP.LoadFromFile('C:\1.bmp');
JPG.Assign(BMP);
finally
BMP.Free;
end;
JPG.CompressionQuality := 80;
JPG.Compress;
JPG.SaveToStream(MS);
finally
JPG.Free;
end;
MS.Position := 0;
S := TIdEncoderMIME.EncodeStream(MS);
finally
MS.free;
end;
MyTCPSocket.SendString(S);
end;
Run Code Online (Sandbox Code Playgroud)
uses
..., IdCoderMIME;
var
S: string;
MS: TMemoryStream;
begin
S := MyTCPSocket.ReadString;
MS := TMemoryStream.Create;
try
TIdDecoderMIME.DecodeStream(S, MS);
MS.Position := 0;
MS.SaveToFile('C:\2.jpg');
finally
MS.Free;
end;
end;
Run Code Online (Sandbox Code Playgroud)