Bonjour,

Je me suis codé un helper sur TBitmap pour l'avoir en TJSONArray et pour le récupérer ensuite à partir du TJSONArray.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
 
function TBitmapHelper.AsJSONArray: TJSONArray;
var
  St: TBytesStream;
  Bts: TArray<byte>;
  I: Integer;
begin
  St := TBytesStream.Create;
  try
    SaveToStream(St);
    Bts := St.Bytes;
    Result := TJSONArray.Create;
    for I := Low(Bts) to High(Bts) do
      Result.Add(Bts[I]);
  finally
    St.Free;
    Finalize(Bts);
  end;
end;
 
procedure TBitmapHelper.LoadFromJSONArray(const JSONArray: TJSONArray);
var
  Ms: TBytesStream;
  Bts: TArray<byte>;
  I: Integer;
begin
  Ms := TBytesStream.Create;
  try
    SetLength(Bts, JSONArray.EstimatedByteSize);
    // I := JSONArray.ToBytes(Bts, 0);
    for I := 0 to JSONArray.Count - 1 do
       Bts[I] := JSONArray.Items[I].GetValue<byte>;
    Ms.WriteData(Bts, Length(Bts));
    Ms.Position := 0;
    LoadFromStream(Ms);
  finally
    Finalize(Bts);
    Ms.Free;
  end;
end;
Sous cette forme, ça fonctionne très bien.

Mais, si je dé-commente
Code : Sélectionner tout - Visualiser dans une fenêtre à part
I := JSONArray.ToBytes(Bts, 0);
et que je regarde les valeurs de Bts, ça ne va pas.

Nom : pasbon.jpg
Affichages : 223
Taille : 73,1 Ko


Nom : bon.jpg
Affichages : 224
Taille : 67,1 Ko


J'ai pas du tout les mêmes valeurs . A savoir que ToBytes me donne un tableau qui fait échouer le chargement du bitmap.

Comme je ne travaille que sur les octets, je ne pense pas à des histoires d'encodage.

Je garde le code qui fonctionne mais j'aimerais bien comprendre le "pourquoi du comment de la chose" ....

Une idée sur cette différence ?

Papy !