Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
String'e çevrilmiş Stream Veri JsontoDataSet Dönüştürme Sorunu.
#11
(06-03-2020, Saat: 10:20)pro_imaj Adlı Kullanıcıdan Alıntı:
(06-03-2020, Saat: 09:56)Fesih ARSLAN Adlı Kullanıcıdan Alıntı: Yukarıdaki JSON veriyi aşağıdaki gibi çözümleyebilirsiniz.
var
  jsonArr: TJSONArray;
const
 strJSON = '[{  "StreamString": "BirDeğer",  "Sifre": "1" }]';
begin
 jsonArr := TJsonObject.ParseJSONValue(TEncoding.UTF8.GetBytes(strJSON), 0) as TJSONArray;
 ShowMessage(jsonArr.GetValue<String>('[0].StreamString'));
end;

Hocam çok teşekkür ederim konuyu bu şekilde çözdüm.

JSON yazma okuma konularıyla ilgili çok örnek yapmak gerekiyor dünden bu güne bu sorunu çözememiştim.

İyi çalışmalar.

(06-03-2020, Saat: 09:12)Fesih ARSLAN Adlı Kullanıcıdan Alıntı: Merhaba,
JSON veriniz aşağıdaki gibi olabilir. 
{
 "Base64IcerenBirOzellik":[
    {
      "IslemId":1,
      "Baslik":"Araba - 1",
      "Dosya":"PCFkb2N0DelphiCaneXBlIGh0bWw+PfGh0bWw+PGhlYWQ=..."
    },
    {
      "IslemId":2,
      "Baslik":"Araba - 2",
      "Dosya":"PCFkb2DelphiCanN0eXBlIGh0bWw+PGh0fgdabWw+PGhlY..."
    },
    {
      "IslemId":3,
      "Baslik":"Araba - 3",
      "Dosya":"PCFkb2N0eXBlIGh0bWw+PGh0bDelphiCanWw+PGhlYWQ+...."
    },
    {
      "IslemId":4,
      "Baslik":"Araba - 4",
      "Dosya":"PCFkb2N0eXDelphiCanBlIGh0bWw+PGh0bWw+PGhlYWQ+PH..."
    }
  ]
}

Tek bir resim ve yanında ek bilgi gönderecek iseniz aşağıdaki gibi olabilir.
{
  "Base64IcerenBirOzellik":{
     "IslemId":1,
     "Baslik":"Araba - 1",
     "Dosya":"PCFkb2N0DelphiCaneXBlIGh0bWw+PfGh0bWw+PGhlYWQ=..."
  }
}

Dosya alanında yalnızca resim değil, herhangi bir binary dosyayı gönderip, alabilirsiniz.
Resmi göndereceğiniz uygulamada (örn. sunucu), dosyayı bir stream'a alıp base64 stringe dönüştürmeniz gerekiyor. Daha sonra yukarıda yapısını vermiş olduğum JSON'a dönüştürürsünüz. 
Base64 string'i alıp, resme dönüştürecek uygulamada (örn. mobil) tarafında, JSON içerisindeki string veriyi okuyup, bunu base64 formatından resim formatına dönüştürebilirsiniz.

Aşağıdaki iki metod yapacağınız base64 dönüşümlerinde size yardımcı olacaktır.
procedure Base64ToImage(const Base64Str: string; const Image: TBitmap);
var
 streamIn: TStringStream;
 streamOut: TBytesStream;
begin
 streamIn := TStringStream.Create(Base64Str);
 try
   streamIn.Position := 0;
   streamOut := TBytesStream.Create;
   try
     TNetEncoding.Base64.Decode(streamIn, streamOut);
     streamOut.Position := 0;
     Image.LoadFromStream(streamOut);
   finally
     streamOut.Free;
   end;
 finally
   streamIn.Free;
 end;
end;
function ImageToBase64(const Image: TBitmap): string;
var
  stremIn: TBytesStream;
  streamOut: TStringStream;
begin
  Result := '';
  if Image.IsEmpty then
    Exit;
  stremIn := TBytesStream.Create;
  try
    Image.SaveToStream(stremIn);
    stremIn.Position := 0;
    streamOut := TStringStream.Create('');
    try
      TNetEncoding.Base64.Encode(stremIn, streamOut);
      Result := streamOut.DataString;
    finally
      streamOut.Free;
    end;
  finally
    stremIn.Free;
  end;
end;

*Ek bilgi olarak yukarıdaki Base64ToImage, ImageToBase64  işlemler aşağıdaki şekilde daha az kod ile yapılabilir.
StreamString :=  EncodeBase64(stream.Memory, stream.Size);
Stream := TBytesStream.Create(DecodeBase64(base64));

Bir soru, sizin önerdiğiniz EncodeBase64/DecodeBase64 metodları yerine sizce neden TNetEncoding kullanmış olabilirim?
Cevapla
#12
(06-03-2020, Saat: 10:43)Fesih ARSLAN Adlı Kullanıcıdan Alıntı:
(06-03-2020, Saat: 10:20)pro_imaj Adlı Kullanıcıdan Alıntı: Hocam çok teşekkür ederim konuyu bu şekilde çözdüm.

JSON yazma okuma konularıyla ilgili çok örnek yapmak gerekiyor dünden bu güne bu sorunu çözememiştim.

İyi çalışmalar.


*Ek bilgi olarak yukarıdaki Base64ToImage, ImageToBase64  işlemler aşağıdaki şekilde daha az kod ile yapılabilir.
StreamString :=  EncodeBase64(stream.Memory, stream.Size);
Stream := TBytesStream.Create(DecodeBase64(base64));

Bir soru, sizin önerdiğiniz EncodeBase64/DecodeBase64 metodları yerine sizce neden TNetEncoding kullanmış olabilirim?

TNetEncoding  dizeleri UTF8 standartında geliyor olabilir.
Cevapla
#13
Utf8 olan byte byte veya string olarak veriyi dönüştürebiliyormuşuz, tam fark bumu   Smile
Cevapla
#14
(06-03-2020, Saat: 14:55)pro_imaj Adlı Kullanıcıdan Alıntı: Utf8 olan byte byte veya string olarak veriyi dönüştürebiliyormuşuz, tam fark bumu   Smile

EncodeBase64/DecodeBase64 metodları önceki Delphi sürümlerinde yer alıyor ve unicode desteği yok.
Yeni Delphi sürümleri encode/decode işlemleri için genişletilmiş özelliklere sahip olan TNetEncoding static class ve metodlarını kullanıyor.
EncodeBase64/DecodeBase64 metodları platforma göre farklılık göstererek, çözümü zor anlamsız (access violation) hatalara neden olabilir.
Cevapla
#15
(06-03-2020, Saat: 09:12)Fesih ARSLAN Adlı Kullanıcıdan Alıntı:
(05-03-2020, Saat: 23:49)pro_imaj Adlı Kullanıcıdan Alıntı: Server tarafına sadece Base64 veriyi gönderdiğimde istediğim işlem sorunsuz oluyor, fakat Base64 verisi haricinde birkaç json bilgisini daha eklemem gerekiyor bu eklediğimde olmuyor. (Base64 bilgisini gönderirken aslında yine json olaran göndermiyorum sadece base64 veriyi gönderiyorum JSON olarak göndermem gerekiyor.)

Merhaba,
JSON veriniz aşağıdaki gibi olabilir. 
{
 "Base64IcerenBirOzellik":[
    {
      "IslemId":1,
      "Baslik":"Araba - 1",
      "Dosya":"PCFkb2N0DelphiCaneXBlIGh0bWw+PfGh0bWw+PGhlYWQ=..."
    },
    {
      "IslemId":2,
      "Baslik":"Araba - 2",
      "Dosya":"PCFkb2DelphiCanN0eXBlIGh0bWw+PGh0fgdabWw+PGhlY..."
    },
    {
      "IslemId":3,
      "Baslik":"Araba - 3",
      "Dosya":"PCFkb2N0eXBlIGh0bWw+PGh0bDelphiCanWw+PGhlYWQ+...."
    },
    {
      "IslemId":4,
      "Baslik":"Araba - 4",
      "Dosya":"PCFkb2N0eXDelphiCanBlIGh0bWw+PGh0bWw+PGhlYWQ+PH..."
    }
  ]
}

Tek bir resim ve yanında ek bilgi gönderecek iseniz aşağıdaki gibi olabilir.
{
  "Base64IcerenBirOzellik":{
     "IslemId":1,
     "Baslik":"Araba - 1",
     "Dosya":"PCFkb2N0DelphiCaneXBlIGh0bWw+PfGh0bWw+PGhlYWQ=..."
  }
}

Dosya alanında yalnızca resim değil, herhangi bir binary dosyayı gönderip, alabilirsiniz.
Resmi göndereceğiniz uygulamada (örn. sunucu), dosyayı bir stream'a alıp base64 stringe dönüştürmeniz gerekiyor. Daha sonra yukarıda yapısını vermiş olduğum JSON'a dönüştürürsünüz. 
Base64 string'i alıp, resme dönüştürecek uygulamada (örn. mobil) tarafında, JSON içerisindeki string veriyi okuyup, bunu base64 formatından resim formatına dönüştürebilirsiniz.

Aşağıdaki iki metod yapacağınız base64 dönüşümlerinde size yardımcı olacaktır.
procedure Base64ToImage(const Base64Str: string; const Image: TBitmap);
var
 streamIn: TStringStream;
 streamOut: TBytesStream;
begin
 streamIn := TStringStream.Create(Base64Str);
 try
   streamIn.Position := 0;
   streamOut := TBytesStream.Create;
   try
     TNetEncoding.Base64.Decode(streamIn, streamOut);
     streamOut.Position := 0;
     Image.LoadFromStream(streamOut);
   finally
     streamOut.Free;
   end;
 finally
   streamIn.Free;
 end;
end;
function ImageToBase64(const Image: TBitmap): string;
var
  stremIn: TBytesStream;
  streamOut: TStringStream;
begin
  Result := '';
  if Image.IsEmpty then
    Exit;
  stremIn := TBytesStream.Create;
  try
    Image.SaveToStream(stremIn);
    stremIn.Position := 0;
    streamOut := TStringStream.Create('');
    try
      TNetEncoding.Base64.Encode(stremIn, streamOut);
      Result := streamOut.DataString;
    finally
      streamOut.Free;
    end;
  finally
    stremIn.Free;
  end;
end;

Fmx platformda base64 e çevirip vlc webservis ile bitmap e çevirmek istediğmde hata mesajı alıyorum. "Bitmap image is not valid"
Cevapla
#16
Merhaba,
Aynı yöntemi kullanıyorum. Herhangi bir sorunla karşılaşmadım. 
Stream'in DataString fonksiyonu ile dönen sonucu bir memo veya text'e yazın. 
Aşağıda linkini paylaştığım web sitesi üzerinden test edin. 
Base64 to Image
Cevapla
#17
(26-10-2020, Saat: 17:28)Fesih ARSLAN Adlı Kullanıcıdan Alıntı: Merhaba,
Aynı yöntemi kullanıyorum. Herhangi bir sorunla karşılaşmadım. 
Stream'in DataString fonksiyonu ile dönen sonucu bir memo veya text'e yazın. 
Aşağıda linkini paylaştığım web sitesi üzerinden test edin. 
Base64 to Image

Fesih hocam teşekkür ederim sorun stream i tekrar bitmap e çevirirken yapmışım.
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  Logo Go3 de döviz tablosunda Date_ alanına veri yazma cinarbil 3 56 11 saat önce
Son Yorum: hi_selamlar
  IEC 61850 Potokolünden veri alma shooterman 1 443 14-03-2024, Saat: 11:38
Son Yorum: shooterman
  Veri Tabanına Kontrollü Kayıt Yaptırma bünyamin68 15 796 08-03-2024, Saat: 00:06
Son Yorum: TuncayDelphi
  Problem - ZKTeco Cihazlardan Anlık Veri Alma mad85 16 8.154 25-12-2023, Saat: 11:35
Son Yorum: osiso
  Cas Terazi Veri gönderimi Delphi sürüm sorunu KUNTAY 12 4.418 08-11-2023, Saat: 00:06
Son Yorum: berkan



Konuyu Okuyanlar: 1 Ziyaretçi