Konuyu Oyla:
  • Derecelendirme: 0/5 - 0 oy
  • 1
  • 2
  • 3
  • 4
  • 5
İndy ile gonderilen image nesnesinin tipini tespi etme
#1
Merhaba

İndy componentleri ile androidden timage nesnesi icindeki resimi gonderiyorum. Lakin wndows tarafindan stream olarak gelen image nesnesinin tipini (png,jpeg,gif,...) tespit edemedigimden image gosteremiyorum yada kaydedemiyorum. Ancak image tipini bilirsem islemi yapiyorum.

Bununla ilgili orneklere stackowerflow dan baktim gelen stream in ilk 8 bytes ini okuyup karar veriyorlar ama benim android tarafta timage ivinde yuklu resmi gonderdigimde ilk 8 byte bu tiplern hic biriyle uyusmuyor.hayret bir sekilde tanimsiz bir resim dsyasi geliyor.

Tavsiyelerinizi umutla bekliyorum.

İyi calismalar. Cepden yazdim klavye ing kusura bakmayin.
Cevapla
#2
Bence sıkıntı farklı.
Gönderdip karşı taraftan aldığınız ham veriyi buraya koyma şansınız var mı?
Ağlarsa kablosuz ağlar, gerisi yerel ağlar...
Cevapla
#3
@41linea41
Stream gönderirken, streamin başına dosya tipini yazsanız (mesela; 3 harf, PNG, JPG yada GIF şeklinde) ve bu streami aldığınız yerde önce bu 3 harfi okusanız sonrasında geri kalanı ile işlem yapsanız mantıklı olur sanki.
There's no place like 127.0.0.1
WWW
Cevapla
#4
(21-03-2019, Saat: 18:25)SimaWB Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.@41linea41
Stream gönderirken, streamin başına dosya tipini yazsanız (mesela; 3 harf, PNG, JPG yada GIF şeklinde) ve bu streami aldığınız yerde önce bu 3 harfi okusanız sonrasında geri kalanı ile işlem yapsanız mantıklı olur sanki.

Server :

try
    ms := TMemoryStream.Create;
    try
      AContext.Connection.IOHandler.LargeStream := True;
      AContext.Connection.IOHandler.ReadStream(ms, ms.size, False);
      ms.Position := 0;
ms.Seek(0,0);
      SetLength(FirstBytes, 8);
      ms.Read(FirstBytes[1], 8);

       if Copy(FirstBytes, 1, 2) = 'BM' then
    begin
      Graphic := TBitmap.Create;
      graphic.SaveToFile( Ortak_Klasor_Yol+'pictures\'+MIRec.Plaka + '_' + datetostr(today)+'_' + MIRec.ResimAdi+'.bmp');

    end else
    if FirstBytes = #137'PNG'#13#10#26#10 then
    begin
      Graphic := TPngImage.Create;
      graphic.SaveToFile( Ortak_Klasor_Yol+'pictures\'+MIRec.Plaka + '_' + datetostr(today)+'_' + MIRec.ResimAdi+'.png');

    end else
    if Copy(FirstBytes, 1, 3) =  'GIF' then
    begin
     // Graphic := TGIFImage.Create;
    end else
    if Copy(FirstBytes, 1, 2) = #$FF#$D8 then
    begin
      Graphic := TJPEGImage.Create;
      graphic.SaveToFile(Ortak_Klasor_Yol+'pictures\'+ MIRec.Plaka + '_' + datetostr(today)+'_' + MIRec.ResimAdi+'.jpeg');
    end 

TThread.Synchronize(nil,
      procedure
      begin
                     Image1.Bitmap.LoadFromStream(ms);
                     Image1.Visible:=true;
              end);

Client android tarafı:  burda 8 byte if döngülerinni hiçbirine girmiyor.
IdTCPClient1.Disconnect;
 try
  MIRec.KabulNu := IntToStr(Kabul_Nu);
  MIRec.Plaka := txtplaka.Text;
  MIRec.Bitmap := TBitmap.Create;
     with IdTCPClient1 do
                begin
                  Host:=txtIP.Text;
                  Port:=11285;
                  ConnectTimeout:=5000;
                  //Connect;
                end;
    for i := 0 to ComponentCount -1 do
      begin
        if (Components[i] is TImage) then
         begin
           if not ((Components[i] as TImage).Bitmap.IsEmpty) then
            begin
             try
              frmprogresskabul.ProgressBar1.Value:=progress + 5;

              IdTCPClient1.Connect;
              try
                MIRec.ResimAdi:=(Components[i] as TImage).Name;
                IdTCPClient1.IOHandler.WriteLn(MIRec.KabulNu);
                IdTCPClient1.IOHandler.WriteLn(MIRec.Plaka);
                IdTCPClient1.IOHandler.WriteLn(MIRec.ResimAdi);
                ms := TMemoryStream.Create;
                try
                MIRec.Bitmap :=(Components[i] as TImage).Bitmap;
                MIRec.Bitmap.SaveToStream(ms);
                IdTCPClient1.IOHandler.LargeStream := True;
                IdTCPClient1.IOHandler.Write(ms, 0, True);
                finally
                ms.Free;
                end;
                finally
              IdTCPClient1.Disconnect;
              end;
              finally
                MIRec.Bitmap.Free;
                 frmprogresskabul.ProgressBar1.Value:=100;
              end;



             end;
         end;
      end;
Cevapla
#5
Bir bitmap yollayıp, android tarafta gelen ilk 2 karakteri bir memoya atıp baktınız mı acep ne geliyor ya da tıkanıklık mı var, stream doğru yolluyor muyum gibisinden
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif


Cevapla
#6
(21-03-2019, Saat: 20:09)mrmarman Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.Bir bitmap yollayıp, android tarafta gelen ilk 2 karakteri bir memoya atıp baktınız mı acep ne geliyor ya da tıkanıklık mı var, stream doğru yolluyor muyum gibisinden
Muharrem abi gelen ilk 8 byte şu şekilde  hiç bir image kriterine uymuyor acaba önce android tarafında mı bi şeyler yapmalıyım.
göndermeye çaalıştığım resim Timage nesnesi içindeki resim.


P1W8oN.png
Cevapla
#7
Merhaba.

- Sorunsalı arayıp bulmak için tüm ihtimalleri bertaraf ederek başlayalım dilerseniz.

- Bir tane TBitmap oluşturmuşsunuz ya ona gerçek bir Bitmap koyup, hatta bitmap de değil, direkt MemoryStream'e bir şey koyup karşı tarafa yollayın. Windows projenizde de aldığınız stream içeriğini incelemeye alın. Önce sizin transfer kısmı doğru çalışıyor mu onu değerlendirin.
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif


Cevapla
#8
ilk denememde şöyle yaptım. android tarafında actionlist yardımıyla galeriden png seçtim. ve gönderdim.
Win tarafında cximage nesnesinin graphicclassname özelliğini png yaptım. ve gelen stream i cximage içine aldım gösterdim ardıdan kaydettim. bu yöntem çalışıyor. ama png harici gönderidğimde cximage de gösterilemiyor ve kaydedemiyorum.

gelen image tipini alabilsem component yada componentsiz win tarafında bi şekild eresmi kaydederim diye değerlendiriyorum.
Cevapla
#9
if not (Components[i] as TImage).Bitmap.IsEmpty dediğiniz yerde TRUE yani içerik dolu olduğu halin gönderim logunu bir memoya alın. Memoya aynı anda gönderdiğiniz Stream'in ilk bir kaç byte içeriğinizi de koyun.

Döngü ile belki de anlamsız bir yere odaklanıyorsunuz, bunu kaynağında yakalamaya gayret edin.  Gönderdiğiniz bir kaç byte öncü veriyi hedefte de aynı mı kontrol edin.

Bu sizin elinizde, birazcık sabır ile taş delinir Smile
Saygılarımla
Muharrem ARMAN

guplouajuixjzfm15eqb.gif


Cevapla
#10
(21-03-2019, Saat: 21:02)41linea41 Adlı Kullanıcıdan Alıntı: Linkleri Görebilmeniz İçin Üye Olmanız Gerekiyor. Üye Olabilmek İçin Lütfen Buraya Tıklayınız.ilk denememde şöyle yaptım. android tarafında actionlist yardımıyla galeriden png seçtim. ve gönderdim.
Win tarafında cximage nesnesinin graphicclassname özelliğini png yaptım. ve gelen stream i cximage içine aldım gösterdim ardıdan kaydettim. bu yöntem çalışıyor. ama png harici gönderidğimde cximage de gösterilemiyor ve kaydedemiyorum.

gelen image tipini alabilsem component yada componentsiz win tarafında bi şekild eresmi kaydederim diye değerlendiriyorum.

Madem TcxImage kullanıyorsunuz, o halde TcxImage'ın GraphicClassName property'sini TdxSmartImage olarak ayarlayın.
Mal sahibi, mülk sahibi
Hani bunun ilk sahibi ?
Mal da yalan mülk de yalan
Var biraz da sen oyalan...
WWW
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  ClientDataSet image field yükleme (DataSnap) 41linea41 3 195 22-07-2019, Saat: 08:13
Son Yorum: Fesih ARSLAN
  Resimi spinner yada image combo box da gösterme 41linea41 1 99 18-07-2019, Saat: 21:28
Son Yorum: narkotik
  ListView'den İmage'e Aktarma ? Mr.Developer 2 239 29-05-2019, Saat: 10:56
Son Yorum: Mr.Developer
  Circle - İmage Sorunu ? Mr.Developer 4 374 15-05-2019, Saat: 08:57
Son Yorum: Mr.Developer
  Image nesnesinde resim olup olmadığın kontrolü 41linea41 5 426 17-03-2019, Saat: 15:11
Son Yorum: mrmarman



Konuyu Okuyanlar: 1 Ziyaretçi