2013-05-14 2 views
2

나는 JSON 배열에 이미지를 변환하는 응용 프로그램이 있고 나는 BLOB 필드로 저장 해요 :JSON 문자열을 이미지로 변환하는 방법은 무엇입니까?

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 이미지의 convertion의 결과는 다음과 같습니다

[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

json 문자열로 저장하면 저장 요구 사항이 크게 늘어납니다. 예 : 텍스트 형식의 '137'은 3 바이트입니다. 0x89 16 진수 바이트로 저장 한 경우 1 바이트. –

+0

'TDBXJSONTools.StreamToJSON'을 사용하여 배열로 변환하는 경우,'TDBXJSONTools.JSONToStream'을 사용하여 되돌릴 필요가 있다고 생각합니다. 하지만 TBlobField에 JSONArray를 변환하여 변환 한 다음 변환하지 않고 원시 데이터를 저장할 수있을 때 다시 변환하는 것은 의미가 없습니다. –

+0

글쎄,이 json 문자열 대신 16 진수 함께 보낼 바이트 변경할 보낼 수 있지만 이것은 내 문제가되지 않습니다.이 문자열을 내 서버로 보내야합니다. 회신을 보내 주셔서 감사합니다 –

답변

6

Ken이 제안한 것처럼 JSON에 관한 모든 것을 잊어 버리고 blob 필드에 직접 쓰는 것이 가장 간단합니다.

저장

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

당신은 JSON은 당신이 필요하다는 의견에 집요 표시

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

로드. 나는 믿기가 힘듭니다. 어쨌든, 문자열에서 개최하여 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 수명 관리에 대한 기본적인 이해를 높이야합니다.

+0

+1. 이 클래스를 사용하여 JSON을 사용하지도 않는다. (실제로 JSON을 사용하지도 않는다.) 역전을 수행하기 위해 실제로 코드를 작성하지는 않았다. 너는 나를 때렸다. :-) –

+1

@David, 그냥 nitpick,'fieldAux'가 무엇인지 모르겠지만 대부분의 스트림 구현은 'LoadFromStream'을 호출 할 때 스트림 위치를 0으로 재설정합니다. – TLama

+0

@TLama'fieldAux'는'TBlobField'입니다. –

관련 문제