使用TCP的方式,將目前的桌面傳輸到另一台電腦上顯示 (一)

使用TCP的方式,將目前的桌面傳輸到另一台電腦上顯示 (一),本篇主要說明如何抓取畫面並藉由改變解晰度來減少資料大小.

  這幾天突發奇想,想寫個程式能把另一台電腦上的桌面即時的傳輸到我的電腦上,可以藉此知道另一台電腦的狀況,所以就開始著手Study這個東西,這個功能會用到一些技術,覺得這些技術也不錯玩,所以把這個文章分幾篇來寫. 最後的程式畫面就會如下:

ImgTrans

底下的那個畫面就是來自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端怎麼去接收與顯示.

 

參考資料 :

MSDN Bitmap 類別

MSDN Graphics 類別

MSDN Screen 類別

鄭子璉 GZipStream/DeflateStream 在壓縮二進位檔會造成檔案放大