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

面白いことに、サイセに答えたら解決しました。

だからここに私がやったことです。

まず、その関数を実行し、画像を含むメモリストリームを取得します。

それから私はこれが好きです:

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

とても簡単です。bsizeは長いです。

スクリーンショットを撮り、それをメモリストリームに入れます。そのメモリストリームの長さが bsize と異なる場合は、それを送信します。

最初の実行では、bsize が null であるため、常に異なります。次に、bsize をそのメモリストリームの長さに設定します。

したがって、次のものが同じ場合はそれを無視し、そうでない場合は繰り返してその長さを bsize に入れます。

これはおそらく最善の方法ではありませんが、機能し、うまく機能しているようです:)

PS: これは .bmp では機能しません。非圧縮は、コンテンツではなく解像度に応じて同じサイズになるためです。

于 2013-08-06T10:22:37.687 に答える