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?
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
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.
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
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
While true do; Hayat döngüsü, kısır değildir! Yapılan bir yanlış, o döngünün dışına çıkmanızı sağlayacaktır.
WWW
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
  TIdTCPServer'dan seçili client'a veri gönderme [çözüldü] Yasemin 12 488 24-11-2020, Saat: 09:27
Son Yorum: pro_imaj
  Qreport dan pdf e dönüştürme noname101 14 514 16-11-2020, Saat: 11:42
Son Yorum: noname101
  Excel Veri Okuma Yöntemi Tercihiniz Nedir? pro_imaj 12 375 11-11-2020, Saat: 22:14
Son Yorum: anemos
  StringList Yavaşlığı ve Güncelleme Sorunu bnyamin86 2 132 11-11-2020, Saat: 11:27
Son Yorum: ozcanm
  String diziyi Json Veriye Dönüştürme - Çözüldü KarahanMesut 10 315 10-11-2020, Saat: 20:33
Son Yorum: pro_imaj



Konuyu Okuyanlar: 1 Ziyaretçi