玄铁剑

成功的途径:抄,创造,研究,发明...
posts - 128, comments - 42, trackbacks - 0, articles - 174

图片流比较

Posted on 2010-07-06 20:23 玄铁剑 阅读(304) 评论(0)  编辑 收藏 引用 所属分类: windows

关于桌面截屏图片分割为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;
            }
        }
    }
}


原文来自:雨枫技术教程网 http://www.fengfly.com
原文网址:http://www.fengfly.com/plus/view-173177-1.html

 

只有注册用户登录后才能发表评论。