簡體   English   中英

德爾福:傳輸圖像

[英]Delphi :Transferring Image

德爾福2010

我通過使用UTF-8的自定義TCP套接字控件傳輸圖像

客戶端

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字符轉換為字節,因此看起來像“?”。

任何想法都非常感謝

您試圖發送二進制數據,就像它是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;

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM