2013-12-03 1 views
-1

Delphi 2010Delphi: Перенос изображения

Я Передача изображения с помощью пользовательского элемента управления TCP сокета использует UTF-8

Client Side

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'); 

Это код работает на том же ПК.

Проблема при отправке изображения на другой компьютер, который использует различную кодировку , он получает изображение, но я вижу много неправильных символов в данных «?????»

Я думаю, что когда TStringStream записывает байты в файл, он не может преобразовать символы Unicode в байты, поэтому он выглядит как «?»

Любая идея ценится

ответ

4

Вы пытаетесь отправить двоичные данные, как если бы это были 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; 
+0

Thx Remy моя проблема в том, что используется сокет только поддерживает отправку utf8 строк я использовал функцию EncodeStream от «EncdDecd» для кодирования потока в base64 ТНХ снова ур помощь:) –

 Смежные вопросы

  • Нет связанных вопросов^_^