【问题标题】:c# remote desktop connection resolutionc#远程桌面连接解析
【发布时间】:2017-03-11 11:48:56
【问题描述】:

我正在编写一个类似于 TeamViewer 的程序。但是我有一个问题是屏幕分辨率太大。如何降低传入图片的质量?

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();
}

【问题讨论】:

  • 你试过new Bitmap(Screen.PrimaryScreen.Bounds.Width / 2,Screen.PrimaryScreen.Bounds.Height / 2)吗?只需创建屏幕分辨率一半大小的位图。一旦这个工作,你可以决定减少大小的百分比。这称为自动缩放。
  • 当我这样做时,它会占用屏幕的某个部分。
  • 好的;然后继续使用原始代码并稍后调整位图的大小。参考这个:stackoverflow.com/q/10442269/5779732

标签: c# image graph image-resizing


【解决方案1】:

从 graphics.CopyFromScreen() 创建一个位图,然后创建另一个位图用于缩放浪费太多 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

【讨论】:

    猜你喜欢
    • 2012-09-27
    • 1970-01-01
    • 2010-11-01
    • 2015-02-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-04
    相关资源
    最近更新 更多