【问题标题】:Compare screenshot image with last one, use only if changed将截图图像与上一张进行比较,仅在更改时使用
【发布时间】:2013-08-06 09:47:46
【问题描述】:

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

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

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 张图像并发送它们,因为对方可以在最后一张图像上“暂停”直到出现了一个新图像。

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

【问题讨论】:

  • 如果你想要一些功能来检查两个位图是否相同,请检查这个:stackoverflow.com/questions/2031217/…
  • 图片不一样怎么办?文件大小?图片?如果是后者,那么性能开销可能比仅仅显示新图像更大
  • 只比较大小,应该非常快吧?只是有一个 int 或具有图像长度的东西,然后将其与下一张图像进行比较,如果相同则将其丢弃,如果没有,则将该大小赋予 int。
  • 好吧,我自己解决了这个问题

标签: c# image compare


【解决方案1】:

有趣的是,当我回答 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,因为未压缩的大小相同,取决​​于分辨率,而不是内容。

【讨论】:

  • 请记住,系统手表每分钟都会改变一次,所以即使看起来没有变化,你也会每分钟得到一张图片;)
  • 对不起,我不明白你的意思。看什么系统?
  • 您在屏幕右下角看到的手表(如果您使用的是 Windows);)
  • 啊,现在我明白你的意思了;P 但这是一个窗口的屏幕截图,所以我神奇地绕过了它;)
猜你喜欢
  • 2019-12-06
  • 1970-01-01
  • 1970-01-01
  • 2016-09-05
  • 2019-04-16
  • 1970-01-01
  • 1970-01-01
  • 2017-08-07
  • 2015-11-01
相关资源
最近更新 更多