德尔福:传输图像

 碳酸钙baby_849 发布于 2023-02-13 10:00

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;

服务器端

Var
TSS: TStringStream;

TSS:=TStringStream.Create;
TSS.WriteString(STR);
TSS.SaveToFile('C:\2.jpg');

这段代码在同一台PC上运行很棒.

当我将图像发送到使用不同编码的其他PC接收图像但我在数据中看到许多错误字符"?????"时的问题

我认为当TStringStream将字节写入文件时,它无法将unicode字符转换为字节,因此它看起来像"?"

任何想法都非常感谢

1 个回答
  • 您正在尝试发送二进制数据,就好像它是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;
    

    var
      MS: TMemoryStream;
    begin
      MS := TMemoryStream.Create;
      try
        MyTCPSocket.ReadStream(MS);
        MS.Position := 0;
        MS.SaveToFile('C:\2.jpg');
      finally
        MS.Free;
      end;
    end;
    

    如果必须将二进制数据作为文本发送,则需要使用真正的二进制到文本编码算法对数据进行编码,例如base64或yEnc,而不是 UTF-8(仅用于编码Unicode文本,而不是二进制数据) ,例如:

    // TIdEncoderMIME and TIdDecoderMIME are part of Indy,
    // which ships with Delphi, but you can use whatever
    // you want...
    

    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;
    

    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;
    

    2023-02-13 10:03 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有