zoukankan      html  css  js  c++  java
  • c#分割桌面截屏,进行图片流比较,不同的图片进行原图片重绘

    关于桌面截屏图片分割为16*8块大小一样的图片,然后把截屏的图和原来的图片进行比较,一样就不发送,不同则发送然后覆盖以前的图片。

    /*http://home.cnblogs.com/yangleiWPF/*/
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Windows;
    using System.Windows.Controls;
    using System.Windows.Data;
    using System.Windows.Documents;
    using System.Windows.Input;
    using System.Windows.Media;
    using System.Windows.Media.Imaging;
    using System.Windows.Navigation;
    using System.Windows.Shapes;
    using System.IO;
    using System.Drawing;
    using System.Runtime.InteropServices;
    using System.Threading;
    using System.Drawing.Imaging;
    
    namespace photoText
    {
        /// <summary>
        /// Window1.xaml 的交互逻辑
        /// </summary>
        public partial class Window1 : Window
        {
            private delegate void UpImageCall(ImageSource Isource);
            private UpImageCall upimage;
            Bitmap ALL;
            public static int x = 16;
            public static int y = 8;
            public static int ScreenX;
            public static int ScreenY;
            public static int SpX;
            public static int SpY;
           //保存所以小张图片流

          List<Bitmap> LBitmap = new List<Bitmap>();
            public Window1()
            {
                InitializeComponent();
                upimage = Isource =>
                {
                    image1.Source = Isource;
                };
                     //获取桌面大小
                ScreenX = GetScreenPixel()[0];
                ScreenY = GetScreenPixel()[1];
                //获取小张图片的长宽
                SpX = ScreenX / x;
                SpY = ScreenY / y;
                //初始化图片数组
                ALL = CaptureDesktopALL();
                CaptureDesktopT();
                Thread aa = new Thread(new ThreadStart(() =>
                {
                    while (true)
                    {
                        //每隔300毫秒截一张图
                        Thread.Sleep(300);
                        CaptureDesktop();
    
                    }
                }));
                aa.Start();
                aa.IsBackground = true;
            }
            /// <summary>
            /// 获取屏幕分辨率
            /// </summary>
            public int[] GetScreenPixel()
            {
                System.Windows.Forms.Screen scr = System.Windows.Forms.Screen.PrimaryScreen;
                System.Drawing.Rectangle rc = scr.Bounds;
                int[] sp = new int[2] { rc.Width, rc.Height };
                return sp;
            }
            /// <summary>
            /// 截屏
            /// </summary>
            [DllImport("gdi32.dll")]
            public static extern bool BitBlt(IntPtr hdcDest, int nXDest, int nYDest, int nWidth, int nHeight, IntPtr hdcSrc, int nXSrc, int nYSrc, System.Drawing.CopyPixelOperation dwRop);
            
            public void CaptureDesktop()
            {
                for (int j = 0; j < x; j++)
                {
                    for (int k = 0; k < y; k++)
                    {
                        try
                        {
                            Bitmap screenBitmap;
                            using (Graphics screenGraphic = Graphics.FromHwnd(IntPtr.Zero))
                            {
                                //根据屏幕大小建立位图,这就是最后截取到的*屏幕图像*
                                screenBitmap = new Bitmap(SpX, SpY, screenGraphic);
                                //建立位图相关Graphics
                                Graphics bitmapGraphics = Graphics.FromImage(screenBitmap);
                                //建立屏幕上下文
                                IntPtr hdcScreen = screenGraphic.GetHdc();
                                //建立位图上下文
                                IntPtr hdcBitmap = bitmapGraphics.GetHdc();
                                //将屏幕捕获保存在位图中
                                BitBlt(hdcBitmap, 0, 0, SpX, SpY, hdcScreen, j * SpX, k * SpY, CopyPixelOperation.CaptureBlt | CopyPixelOperation.SourceCopy);
                                //关闭位图句柄
                                bitmapGraphics.ReleaseHdc(hdcBitmap);
                                //关闭屏幕句柄
                                screenGraphic.ReleaseHdc(hdcScreen);
                                //释放位图对像
                                bitmapGraphics.Dispose();
                                //释放屏幕对像
                                screenGraphic.Dispose();
                                //比较之前的图片和现在的图片是否相同,不同则替换
                                if (ImageCompareString(LBitmap[j * 8 + k], screenBitmap))
                                {
                                    //保存最新的图片
                                    LBitmap[j * 8 + k] = screenBitmap;
                                    Graphics g = Graphics.FromImage(ALL);
                                    //覆盖原来的图片区域
                                    g.DrawImageUnscaled(LBitmap[j * 8 + k], j * SpX, k * SpY);
                                }
                            }
                        }
                        catch
                        {
                            throw;
                        }
                    }
                }
                MemoryStream stream = new MemoryStream();
                ALL.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
                // MStream(ALL);
                ImageSourceConverter imageSourceConverter = new ImageSourceConverter();
                //显示整张图片
                image1.Dispatcher.Invoke(upimage, (ImageSource)imageSourceConverter.ConvertFrom(stream));
            }
            //获得压缩文件流 减少像素
            private MemoryStream MStream(Bitmap myBitmap)
            {
                ImageCodecInfo myImageCodecInfo;
                System.Drawing.Imaging.Encoder myEncoder;
                EncoderParameter myEncoderParameter;
                EncoderParameters myEncoderParameters;
                MemoryStream ms = new MemoryStream();
                //设置Mime类型
                myImageCodecInfo = GetEncoderInfo("image/jpeg");
                myEncoder = System.Drawing.Imaging.Encoder.Quality;
                myEncoderParameters = new EncoderParameters(1);
                //设置图片像素100L为最大
                myEncoderParameter = new EncoderParameter(myEncoder, 50L);
                myEncoderParameters.Param[0] = myEncoderParameter;
                myBitmap.Save(ms, myImageCodecInfo, myEncoderParameters);
                return ms;
            }
            private static ImageCodecInfo GetEncoderInfo(String mimeType)
            {
                int j;
                ImageCodecInfo[] encoders;
                encoders = ImageCodecInfo.GetImageEncoders();
                for (j = 0; j < encoders.Length; ++j)
                {
                    if (encoders[j].MimeType == mimeType)
                        return encoders[j];
                }
                return null;
            }
            /// <summary>
            /// 抓取有鼠标的桌面,并且能抓到透明窗体
            /// </summary>
            /// <returns></returns>
            public void CaptureDesktopT()
            {
                for (int j = 0; j < x; j++)
                {
                    for (int k = 0; k < y; k++)
                    {
                        try
                        {
                            Bitmap screenBitmap;
                            using (Graphics screenGraphic = Graphics.FromHwnd(IntPtr.Zero))
                            {
                                //根据屏幕大小建立位图,这就是最后截取到的*屏幕图像*
                                //screenBitmap = new Bitmap(1280, 800, screenGraphic);
                                screenBitmap = new Bitmap(SpX, SpY, screenGraphic);
                                //建立位图相关Graphics
                                Graphics bitmapGraphics = Graphics.FromImage(screenBitmap);
                                //建立屏幕上下文
                                IntPtr hdcScreen = screenGraphic.GetHdc();
                                //建立位图上下文
                                IntPtr hdcBitmap = bitmapGraphics.GetHdc();
                                //将屏幕捕获保存在位图中
                                BitBlt(hdcBitmap, 0, 0, SpX, SpY, hdcScreen, j * SpX, k * SpY, CopyPixelOperation.CaptureBlt | CopyPixelOperation.SourceCopy);
                                //关闭位图句柄
                                bitmapGraphics.ReleaseHdc(hdcBitmap);
                                //关闭屏幕句柄
                                screenGraphic.ReleaseHdc(hdcScreen);
                                //释放位图对像
                                bitmapGraphics.Dispose();
                                //释放屏幕对像
                                screenGraphic.Dispose();
                                //初始化16*8张图片
                                LBitmap.Add(screenBitmap);
                            }
                        }
                        catch
                        {
                           
                        }
                    }
                }
                //Graphics g = Graphics.FromImage(ALL);
                //g.DrawImageUnscaled(LBitmap[2], 200, 200);
                //MemoryStream stream = new MemoryStream();
                //ALL.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
                //ImageSourceConverter imageSourceConverter = new ImageSourceConverter();
                //image1.Source = (ImageSource)imageSourceConverter.ConvertFrom(stream);
            }
            public Bitmap CaptureDesktopALL()
            {
                Bitmap screenBitmap;
                using (Graphics screenGraphic = Graphics.FromHwnd(IntPtr.Zero))
                {
                    //根据屏幕大小建立位图,这就是最后截取到的*屏幕图像*
                    //screenBitmap = new Bitmap(1280, 800, screenGraphic);
                    screenBitmap = new Bitmap(GetScreenPixel()[0], GetScreenPixel()[1], screenGraphic);
                    //建立位图相关Graphics
                    Graphics bitmapGraphics = Graphics.FromImage(screenBitmap);
                    //建立屏幕上下文
                    IntPtr hdcScreen = screenGraphic.GetHdc();
                    //建立位图上下文
                    IntPtr hdcBitmap = bitmapGraphics.GetHdc();
                    //将屏幕捕获保存在位图中
                    BitBlt(hdcBitmap, 0, 0, GetScreenPixel()[0], GetScreenPixel()[1], hdcScreen, 0, 0, CopyPixelOperation.CaptureBlt | CopyPixelOperation.SourceCopy);
                    //关闭位图句柄
                    bitmapGraphics.ReleaseHdc(hdcBitmap);
                    //关闭屏幕句柄
                    screenGraphic.ReleaseHdc(hdcScreen);
                    //释放位图对像
                    bitmapGraphics.Dispose();
                    //释放屏幕对像
                    screenGraphic.Dispose();
                    MemoryStream stream = new MemoryStream();
                    screenBitmap.Save(stream, System.Drawing.Imaging.ImageFormat.Png);
                    ImageSourceConverter imageSourceConverter = new ImageSourceConverter();
                    image1.Source = (ImageSource)imageSourceConverter.ConvertFrom(stream);
                    return screenBitmap;
                }
            }
            //图片比较类
            public static bool ImageCompareString(Bitmap firstImage, Bitmap secondImage)
            {
                MemoryStream ms = new MemoryStream();
                firstImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                String firstBitmap = Convert.ToBase64String(ms.ToArray());
                ms.Position = 0;
                secondImage.Save(ms, System.Drawing.Imaging.ImageFormat.Jpeg);
                String secondBitmap = Convert.ToBase64String(ms.ToArray());
                if (firstBitmap.Equals(secondBitmap))
                {
                    return false;
                }
                else
                {
                    return true;
                }
            }
        }
    }
    
    
  • 相关阅读:
    JavaWeb的三大作用域
    软件工程最后一次作业
    软件工程第四次作业
    软件工程第三次作业
    软件工程第二次作业
    2020软件工程第一次作业
    新建Maven项目报错:Cannot resolve plugin org.apache.maven.plugins:maven-clean-plugin:x.x
    浅谈C++ STL
    C++中几种输入输出cin、cin.getline()、getline()、sscanf()、sprintf()、gets()等
    包含头文件的问题之1.7编程基础之字符串 24:单词的长度
  • 原文地址:https://www.cnblogs.com/yangleiWPF/p/1707424.html
Copyright © 2011-2022 走看看