如何将JSON字符串转换为图像?

Ric*_*oal 2 delphi json datasnap delphi-xe2

我有一个应用程序将图像转换为JSON数组,我将其保存到blob字段:

function getImage(): String;
var
  memorystream : TMemoryStream;
  jsonArray    : TJSONArray;

begin
  memorystream := TMemoryStream.Create;
  myImage.Picture.Graphic.SaveToStream(memorystream);
  memorystream.Position := 0;

  jsonArray := TJSONArray.Create;
  jsonArray := TDBXJSONTools.StreamToJSON(memorystream, 0, memorystream.Size);

  memorystream.Free;

  Result := jsonArray.ToString;
end;
Run Code Online (Sandbox Code Playgroud)

转换PNG图像的结果如下所示:

[137,80,78,71,13,10,26,10,0,0, ... ]
Run Code Online (Sandbox Code Playgroud)

此结果存储在blob字段中,我使用此代码返回:

stream := TStream.Create;
stream := cdsPesquisa.CreateBlobStream(fieldAux, bmRead);
stream.Position := 0;

jsonArray := TJSONArray.Create;
jsonArray := TDBXJSONTools.StreamToJSON(stream, 0, stream.Size);
Run Code Online (Sandbox Code Playgroud)

在这里,我[137,80,78,71,13,10,26,10,0,0, ... ]在开头有相同的JSON字符串,但我需要再次将此JSON数组转换为图像.

我怎样才能做到这一点?

Dav*_*nan 6

正如Ken所建议的那样,最简单的是忘记JSON并直接写入blob字段.

保存

Stream := TMemoryStream.Create;
try
  myImage.Picture.Graphic.SaveToStream(Stream);
  Stream.Position := 0;
  fieldAux.LoadFromStream(Stream);
finally
  Stream.Free;
end;
Run Code Online (Sandbox Code Playgroud)

载入中

Stream := TMemoryStream.Create;
try
  fieldAux.SaveToStream(Stream);
  Stream.Position := 0;
  myImage.Picture.Graphic.LoadFromStream(Stream);
finally
  Stream.Free;
end;
Run Code Online (Sandbox Code Playgroud)

您似乎坚持JSON是您需要的评论.我发现有点难以置信.但无论如何,要将您的JSON数组(以字符串形式保存)转换为图像,请执行以下操作:

jsonArray := TJSONObject.ParseJSONValue(jsonString) as TJSONArray;
try
  Stream := TDBXJSONTools.JSONToStream(jsonArray);
  try
    Stream.Position := 0;
    myImage.Picture.Graphic.LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
finally
  jsonArray.Free;
end;
Run Code Online (Sandbox Code Playgroud)

此外,据我所知,您调用的代码TDBXJSONTools.StreamToJSON不起作用.它产生一个空的JSON数组对象.


最后,你的代码像筛子一样泄漏.您不必担心自己不需要释放自己创建的对象.您也错误地实例化对象,然后用不同的对象覆盖新对象,从而泄漏第一个对象.看看我是如何创建对象的,并与您的代码进行比较.例如:

jsonArray := TJSONArray.Create ;
jsonArray := TDBXJSONTools.StreamToJSON( memorystream , 0 , memorystream.Size ) ;
Run Code Online (Sandbox Code Playgroud)

在这里,您实例化一个TJSONArray对象并存储对该对象的引用jsonArray.释放该参考是你的工作.但是当您使用对返回的新对象的引用覆盖它时,您会在下一行中立即放弃该引用StreamToJSON.既然你永远不会自由jsonArray,你就会泄漏一个,而不是两个物体.

您需要了解对Delphi生命周期管理的基本了解.