我有一个将图像转换为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数组再次转换为图像。
我怎样才能做到这一点?
答案 0 :(得分:6)
正如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生命周期管理的基本了解。