C# Socket İle Byte[] Aktarımı
-
Merhaba Arkadaşlar,
Şimdi projemde client pc nin ekranını server yardımıyda admin pc ye aktarmak istiyorum şimdilik server a aktardım görüntüyü ama işin başındayken şunu merak ediyorum ScreenShot aldıktan direk göndermeden önce ne yapmalıyım malum network kullanımını düşünmem lazım ekranın kalitesini düşürmeyi planlıyorum ama başka ne yapabilirim yada en iyi yol hangisidir acaba.
yardımlarınız için şimdiden teşekkürler.
-
Hocam en kolayı screenshotu sıkıştıracan tabi, normal bi ekran görüntüsü 5MB falan dır. PNG yapabilirsin. 250 kblara kadar iner.
Ama asıl yapman gereken bir önceki ekran görüntüsü ile farkı almak. bunu her pixelin RGB değerlerini önceki ile xorlayarak yapabilirsin ama c# ı kasar bu, native winapi kullanıyor olsan Bitblt parametreleri ile bunu yapabilirdin. Bence GetDesktopWindow() GetDc, Bitblt apilerini çağırarak yapmalısın.
Önceki ekran görüntüsüyle farkı almanın bir başka yolu da genelde webcam iletişiminde kullanılan motionjpeg sıkıştırması, resimlerde küçük kayıpların önemi olmadığından bu daha iyi olurdu. fakat bunu önceden kullanmadım libraryleri free olarak varmı bilmiorum.
HolyOne tarafından 04/Haz/14 12:49 tarihinde düzenlenmiştir -
hocam c# dan anlamam ama ekran görüntüsünü resim formatında değilde base64 ile encode edip text formatında transfer edersen serverda data:image ile yazdırırsan epey bişeyden kar edebilirsin gibi görünüyo.
-
holy nin dediğine ek olarak sıkıştırma için gzip kullanılabilir. sonra bunu byte dizisine convert edip yollayacaksın. kendine uygun bir sıkıştırma algoritması da geliştirebilirsin ama bunlar biraz daha ileri seviye konular. benim daha önce gördüğüm kodlarda sıkıştırma için gzip kullanılıyor (daha çok java da),
yine holy nin bahsettiği api lerle ekran görüntüsü alabilirsin ama c# da api kullanmasına girmeden de yapabilirsin. okuduğum kadarıyla .net framework 4.0 da bu tarz api kullanımı çalışmıyormuş
Unfortunately, this overload has a critical bug that prevents this from working. It doesn't validate the value properly. Still not fixed in .NET 4.0. There is no other good fix but fall back to using P/Invoke to make the screen shot. Here's an example:
Not : api detayları için pinvoke.net sitesini kullanabilirsin (holy nin bahsettiği api leri araştırabilirsin, örnek kodlar, açıklamalar mevcut orda)
şu tarz bi kod ile bitmap elde edersin
private static Bitmap GetScreenShot() { Bitmap bitmap = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format32bppArgb); using (Graphics graphics = Graphics.FromImage(bitmap)) { graphics.CopyFromScreen(Screen.PrimaryScreen.Bounds.X, Screen.PrimaryScreen.Bounds.Y, 0, 0, Screen.PrimaryScreen.Bounds.Size, CopyPixelOperation.SourceCopy); } return bitmap; }sonra
byte[] arr = resim.ToByteArray(ImageFormat.Bmp);şeklinde byte dizisine dönderirsin.. bunu da gzip ile sıkıştırırsan istediğini elde edersin diye düşünüyorum.
ama amacın sık sık resim yollamak ise bu yol performanslı değildir, onun için de teamviewer ın mantığını kullanmak gerekecek. Çekilen tüm resmi tarayıp değişen bölgenin bilgisini yollayacaksın. Bu sayede tüm resmi yollamaktan kurtulmuş olursun. Bunla ilgili open source projeler mevcut onlara bakabilirsin.
kolay gelsin
