3

我有一个 Android 应用程序,它使用 XE2 中的 RESTFul 客户端内容将数据发送回 datasnap 服务器。

我可以很好地发送标准基本数据,但应用程序的一部分包括存储用户拍摄的图像。

我最初尝试使用 TStream,但从未返回到服务器 - 它似乎只是挂起。我目前的想法是将图像的 byte[] 转换为 base64 字符串并在 datasnap 端重新转换。

要在 Android 端将图像转换为 base64 字符串,我执行以下操作:

ByteArrayOutputStream stream = new ByteArrayOutputStream();
image.compress(Bitmap.CompressFormat.JPEG, 100, stream); 
String encodedString = Base64.encode(stream.toByteArray)

encodedString然后作为标准 Delphi 字符串发送

在服务器端,要解码的代码是

  function Base64Decode(const EncodedText: string): TBytes;
  var
    DecodedStm: TBytesStream;
    Decoder: TIdDecoderMIME;
  begin
    Decoder := TIdDecoderMIME.Create(nil);
    try
      DecodedStm := TBytesStream.Create;
      try
        Decoder.DecodeBegin(DecodedStm);
        Decoder.Decode(EncodedText);
        Decoder.DecodeEnd;
        Result := DecodedStm.Bytes;
        SetLength(Result, DecodedStm.Size);  // add this line
      finally
        DecodedStm.Free;
      end;
    finally
      Decoder.Free;
    end;
end;

然后

var
    Bytes : TBytes;
  image : TJPEGImage;
  stream : TBytesStream;
begin
  Bytes := Base64Decode(Photo);
  stream := TBytesStream.Create(Bytes);
  image := TJPegImage.Create;
  image.LoadFromStream(stream);

这会在方法中产生错误loadFromStream,基本上 jpeg 已损坏。我猜要么编码有问题(不太可能),要么转换为delphi字符串然后解码为字节[](可能)。

所以这是一个冗长的方式来询问是否有人对如何将图像从 Android 应用程序发送到 Delphi XE2 中的 DataSnap 服务器有任何建议?

4

2 回答 2

2
uses
DBXJSONCommon, 


function TServerImageMethods.ConvertJPEGToJSon(pFilePath: string): TJSONArray;
var
  AFileStream: TFileStream;
begin
  AFileStream := TFileStream.Create(pFilePath, fmOpenRead);

  Result := TDBXJSONTools.StreamToJSON(AFileStream, 0, AFileStream.Size);
end;

我用以下方法转换回 TStream:

AFileStream := TDBXJSONTools.JSONToStream(JSONArray);

PS.:您可以使用 ZLIB 压缩流以获得最佳性能。

于 2013-04-18T15:59:10.360 回答
0

我正在加载 JPEG 图像,但我在开头设置了指针,并配置了图像:

stream.Seek(0,soFromBeginning);
image.PixelFormat := jf24Bit;
image.Scale := jsFullSize;
image.GrayScale := False;
image.Performance := jpBestQuality;
image.ProgressiveDisplay := True;
image.ProgressiveEncoding := True;
image.LoadFromStream(stream);

If stream.size > 0 then
 // OK
else
 // not OK

我还将尝试解码一个 ANSIString,以检查它是否与 Unicode 更改有关。

于 2012-07-19T14:37:54.767 回答