2

我有一个将图像转换为 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;

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

[137,80,78,71,13,10,26,10,0,0, ... ]

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

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

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

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

我怎样才能做到这一点?

4

1 回答 1

7

正如 Ken 所建议的,最简单的方法是忘记所有关于 JSON 并直接写入 blob 字段。

保存

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

正在加载

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

您在评论中似乎坚持认为 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;

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


最后,您的代码像筛子一样泄漏。您误以为不需要释放您创建的对象。您还错误地实例化了对象,然后用不同的对象覆盖了新对象,从而泄漏了第一个对象。看看我是如何创建对象的,并与您的代码进行比较。例如:

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

在这里,您实例化一个TJSONArray对象并将对该对象的引用存储在jsonArray. 释放该引用是您的工作。但是,当您使用对StreamToJSON. 由于您根本没有释放jsonArray,所以您泄漏的不是一个,而是两个对象。

你确实需要复习你对 Delphi 生命周期管理的基本理解。

于 2013-05-14T19:25:50.477 回答