1

我想知道是否可以截取屏幕截图,并且仅在与上一张不同时才保留它。

所以目前我正在使用这个功能。

private static MemoryStream PrintWindow(string prcname)
{
    IntPtr hwnd;
    using (var proc = Process.GetProcessesByName(prcname)[0])
    {
        hwnd = proc.MainWindowHandle;
    }
    Rect rc;
    NativeMethods.GetWindowRect(hwnd, out rc);
    using (Bitmap bmp = new Bitmap(rc.Width, rc.Height, System.Drawing.Imaging.PixelFormat.Format24bppRgb))
    {
        using (Graphics gfxBmp = Graphics.FromImage(bmp))
        {
            IntPtr hdcBitmap = gfxBmp.GetHdc();
            try
            {
                NativeMethods.PrintWindow(hwnd, hdcBitmap, 0);
            }
            finally
            {
                gfxBmp.ReleaseHdc(hdcBitmap);
            }
        }
        MemoryStream ms = new MemoryStream();
        bmp.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp);
        return ms;
    }
}

然后我通过网络发送图像并将其显示在另一侧。

现在,我想知道是否可以在拍摄新图像时发送。或者好吧,不是新的,而是另一个图像。假设它需要 10 张图像,并且所有图像看起来都完全相同,并且没有必要使用所有这 10 张图像并发送它们,因为对方可以在最后一张图像上“暂停”直到出现了一个新的图像。

希望您能理解我在这里要解释的内容。

4

1 回答 1

0

有趣的是,当我回答 Sayse 时,我解决了它。

所以这就是我所做的。

首先,我运行该函数并获得一个包含图像的内存流。

然后我喜欢这样:

                        if (bsize != ms.Length)
                        {
                            bsize = ms.Length;
                            writer.Write((int)ms.Length);
                            writer.Write(ms.GetBuffer(), 0, (int)ms.Length);
                        }

所以真的很容易。bsize 很长。

所以它需要一个截图,把它放在一个内存流中。如果该内存流长度与 bsize 不同,它将发送它。

现在第一次运行,它总是不同的,因为 bsize 是空的。然后它将 bsize 设置为该内存流的长度。

因此,如果下一个相同,它将忽略它,如果不是,它将重复并将该长度设置为 bsize。

现在这可能不是最好的方法,但它有效并且似乎运作良好:)

PS:这不适用于 .bmp,因为未压缩的大小相同,取决​​于分辨率,而不是内容。

于 2013-08-06T10:22:37.687 回答