Server - Client arasında yolladığım packet içine bitmap...

Delphi'de kod yazma ile ilgili sorularınızı bu foruma yazabilirsiniz.
Cevapla
Kullanıcı avatarı
feinpus
Üye
Mesajlar: 214
Kayıt: 17 Kas 2003 04:37
Konum: İstanbul
İletişim:

Server - Client arasında yolladığım packet içine bitmap...

Mesaj gönderen feinpus »

Ben Client makinaların ekran görüntüsünü alacak birşey yazıyorum. Ancak hazırladığım packed içerisine eklediğim bitmap dosyası servera gelene kadar kayboluyor :P

Kısaca;

Kod: Tümünü seç

Type
   TSendScreen = Packed Record
   Screen : TBitmap;
   MouseXY : TPoint;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
with IdTCPClient1 do
  begin
  Host :='10.0.0.103';
  Port := 924;
   connect;
sns.Screen := TBitmap.create();
SNS.Screen.Assign(Image1.Picture.Bitmap);
sns.MouseXY.X:=mpos.x;
sns.MouseXY.y:=mpos.y;


  WriteBuffer(SNS,SIZEOF(SNS),true);
  Disconnect;
  end;
end;

şeklinde bir kod yazdım paketi server a yolluyorum ancak mouse koordinatlarını alıyorum image gelmiyor.

Sizce nerede bi eksiklik var ?
Oldeye Software
http://www.oldeye.com
fduman
Moderator
Mesajlar: 2749
Kayıt: 17 Ara 2004 12:02
Konum: Ankara

Mesaj gönderen fduman »

Kod: Tümünü seç

Type
   TSendScreen = Packed Record
   Screen : TBitmap;
   MouseXY : TPoint;
end; 
Buradaki Screen değeri Pointer bir değerdir. Yani bitmap'in içeriğini değil bellekteki 32 bitlik adresini tutar.

Sen karşı tarafa 4 byte'tan oluşan bu adres değerini yolluyorsun. Haliyle de resim içeriğini alamıyorsun.

İçeriği alabilmen için bitmap'ini bir array'e yazmalı, bu array'i karşıya göndermelisin.

Bunu da bir record içinde tutamazsın. Çünkü bitmap büyüklüğü değişkendir. Record ile sabit genişlikteki verileri tutarsın.

Indy kullandığını gördüğümden, indy'nin stream yollama methodlarını kullanmanı öneririm.

Bir Tmemorystream yaratıp, Bitmap'in içeriğini SaveToStream ile stream'ine yazarsın. Indy'nin stream yollayıcı methodu ile de karşı tarafa gönderir, karşı tarafta tam tersini yaparsın.
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

resmin boyutu çok fazla olduğu için muhtemelen. bmp yerine jpg göndermeyi dene. ve ayrıca resmi stream olarak gönder bence, bunu da parçalayarak gönder her parça server a ulaştığında server client ta tamam mesajı göndersin client sonrasını göndersin, aksi durmdada son gönderilen tekrar göndersin. Bu mantık bence daha uygun ve garantili olur.

Kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Kullanıcı avatarı
feinpus
Üye
Mesajlar: 214
Kayıt: 17 Kas 2003 04:37
Konum: İstanbul
İletişim:

Mesaj gönderen feinpus »

Bunun için şöyle birşey hazırladım;

Kod: Tümünü seç

var
jpgimg : TJPEGImage;
mempic : TMemoryStream;
begin

      jpgimg:=TJpegImage.Create;
      jpgimg.assign(Image1.Picture.Bitmap);

      mempic:=TMemoryStream.Create;
      jpgimg.savetostream(mempic);

mempic.Position:=0;
mempic.SaveToFile('c:\dadadad.jpg'); /// Sorun yok kaydediyor.

Image2.Picture.Graphic.LoadFromStream(mempic); //Access violation hatası alıyorum
Image2.Picture.Bitmap.LoadFromStream(mempic);  /// burası JPG Formatını tanımıyor...
end;
Dosya kaydedip oradan okumak istemiyorum direk olarak stream gönderip bunun içerisinden resmi göstermek istiyorum.

Bir öneriniz var mı ?
Oldeye Software
http://www.oldeye.com
Kullanıcı avatarı
rsimsek
Admin
Mesajlar: 4482
Kayıt: 10 Haz 2003 01:48
Konum: İstanbul

Mesaj gönderen rsimsek »

Ekran görüntüsünün bütünü yerine DivX codec'indeki gibi değişen kısımların çözünürlüğü çok yüksek olmayan görüntüsünü diğer uzaktan erişim (Remote Administrator) programları gibi gönderebilirsin.
Bilgiyi paylaşarak artıralım! Hayatı kolaylaştıralım!!
Kullanıcı avatarı
feinpus
Üye
Mesajlar: 214
Kayıt: 17 Kas 2003 04:37
Konum: İstanbul
İletişim:

Mesaj gönderen feinpus »

Ewt bu konu üzerinde biraz araştırma yapayım.

Bu konu üzerinde çalışmış olan arkadaşlarında izledikleri yöntem fikirlerini bekliyorum.

Herkese iyi çalışmalar..
Oldeye Software
http://www.oldeye.com
Kullanıcı avatarı
freeman35
Admin
Mesajlar: 2380
Kayıt: 12 Haz 2003 04:05
Konum: merkez camii yanı

Mesaj gönderen freeman35 »

Kod: Tümünü seç

JpegImage.Assign(Bitmap);
      OutStream.Clear;
      OutStream.Position := 0;
      JpegImage.SaveToStream(OutStream);
      OutStream.Position := 0;
    finally
      Bitmap.Free;
    end;
kolay gele
ZAGOR TENAY TÜRK'tür... TÜRK kalacak...
Zoru başarırım, İmkansız zaman alır
FreeMan 35.5

Soru sormaya üşenmiyorsan, sorunun çözümünü yazmaya da üşenme !!!
Cevapla