使用TCP的方式,將目前的桌面傳輸到另一台電腦上顯示 (一),本篇主要說明如何抓取畫面並藉由改變解晰度來減少資料大小.
這幾天突發奇想,想寫個程式能把另一台電腦上的桌面即時的傳輸到我的電腦上,可以藉此知道另一台電腦的狀況,所以就開始著手Study這個東西,這個功能會用到一些技術,覺得這些技術也不錯玩,所以把這個文章分幾篇來寫. 最後的程式畫面就會如下:
底下的那個畫面就是來自192.168.1.60
即然要把桌面的畫面傳到另一台電腦去顯示,那麼首先就要先能抓取到目前的桌面畫面,因為網路傳輸量的關係,所以圖檔也不能太大,也因此這部份額外抓出來談.
1: private byte[] GetScreen()
2: {
3: int Height = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Height;//抓取桌面的高度
4: int Width = System.Windows.Forms.Screen.PrimaryScreen.Bounds.Width;//抓取桌面的寬度
5: Bitmap screenshot = new Bitmap(Width, Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
6: Graphics graph = Graphics.FromImage(screenshot);
7:
8: graph.CopyFromScreen(0, 0, 0, 0, new Size(Width, Height), CopyPixelOperation.SourceCopy);
9:
10: int FixWidth = 800; //設定新圖檔的解晰度,寬度
11: int FixHeight = Convert.ToInt16((Decimal.Parse(FixWidth.ToString()) / Decimal.Parse(Width.ToString())) * Height); //計算高度
12: Bitmap bmp = new Bitmap(screenshot, new Size(FixWidth, FixHeight));
13: MemoryStream ms = new MemoryStream();
14: bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg); //把圖檔用新的解晰度去儲存
15: screenshot.Dispose();
16: graph.Dispose();
17: bmp.Dispose();
18: return ms.GetBuffer();
19: }
這段程式碼是這整個功能的一部份,主要是用來回傳把桌面用byte[]來回傳,而抓圖部份則是在3~8行就完成了,而10~14則是改變圖檔的解晰度去儲存,如果用原始大小,似乎大了點,所以調一下解晰度再回傳,可以節省一點頻寬,或許這時有人會想問,那把它壓縮啊! 答案是不行的,問題說明請參考鄭子璉的 : GZipStream/DeflateStream 在壓縮二進位檔會造成檔案放大
而第3,4行呢,則可依個人需求去抓取桌面,比如說,要的只是桌面,不含工具列,或是跟此範例一樣,是含工具列的,當然也可以抓ActiveWindow,那第8行就也要改一下,才會抓對位置.
所以呢,除了改變解晰度及色彩外,似乎沒有其它可用的壓縮方案來進行壓圖的動作,抓取桌面或部份,就看個人需求,而這段Code就可以把圖面用byte[]回傳了,下次就會是說明,如何用TCP來把它傳送出去,及Client端怎麼去接收與顯示.
參考資料 :
鄭子璉 GZipStream/DeflateStream 在壓縮二進位檔會造成檔案放大