2017-03-11 15 views
0

私はTeamViewerに似たプログラムを書いています。しかし、画面の解像度が高すぎるという問題があります。入力画像の品質を下げるにはどうしたらいいですか? graphics.CopyFromScreenからビットマップを作成するc#リモートデスクトップ接続の解像度

byte[] ScreenShut() 
{ 
    Bitmap bmp = new Bitmap(Screen.PrimaryScreen.Bounds.Width,Screen.PrimaryScreen.Bounds.Height); 

    Graphics gr = Graphics.FromImage(bmp); 
    bmp.SetResolution(96.0F,96.0F); 
    gr.CopyFromScreen(0, 0, 0, 0, new Size(bmp.Width, bmp.Height)); 
    MemoryStream ms = new MemoryStream(); 
    bmp.Save(ms, ImageFormat.Png); 
    return ms.GetBuffer(); 
} 
+0

'新しいビットマップ(Screen.PrimaryScreen.Bounds.Width/2、Screen.PrimaryScreen.Bounds.Height/2)'を試しましたか?画面解像度の半分のビットマップを作成するだけです。これが機能すると、サイズを減らす割合を決めることができます。これを自動スケーリングといいます。 –

+0

私はそうすると、画面の特定の部分を取る。 –

+0

Ok;元のコードで続けて、後者のビットマップのサイズを変更します。これを参照してください:http://stackoverflow.com/q/10442269/5779732 –

答えて

1

()、その後廃棄すぎてCPUをスケーリングするための別のビットマップを作成します。

[DllImport("user32")] static extern int GetDC(int hWnd); 
[DllImport("user32")] static extern int ReleaseDC(int hwnd, int hDC) 
[DllImport("gdi32")] static extern int StretchBlt(int hdc, int x, int y, int nWidth, int nHeight, int hSrcDC, int xSrc, int ySrc, int nSrcWidth, int nSrcHeight, int dwRop); 

     int W = Screen.PrimaryScreen.Bounds.Width; 
     int H = Screen.PrimaryScreen.Bounds.Height; 
     int dW = W * 2/3; // 66% 
     int dH = H * 2/3; // 66% 

     Bitmap img = new Bitmap(dW, dH); 
     Graphics g = Graphics.FromImage(img); 
     var dc = g.GetHdc(); 
     var screen = GetDC(0); 
     StretchBlt(dc.ToInt32(), 0, 0, dW, dH, screen, 0, 0, W, H, 0xCC0020); 
     g.ReleaseHdc(dc) ; 
     ReleaseDC(0, screen) 

     img.Save(@"C:\123.png", ImageFormat.Jpeg); 

イメージを拡大縮小した後、テキストが読みにくくなります。スケーリングは約75%にする必要があります。その後、JPG圧縮形式を使用してサイズを縮小しますsee here

関連する問題