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しないため、1 つではなく 2 つのオブジェクトがリークします。

Delphi のライフタイム管理に関する基本的な理解を深める必要があります。

于 2013-05-14T19:25:50.477 に答える