目前用的DC,BitBlt 方法 截一屏将近160MS 分块也差不多160MS(4*4)分块代码:                       graphic.DrawImage(im, 0, 0, new Rectangle(x, y, width, height), GraphicsUnit.Pixel);
                        //从作图区生成新图
                        IntPtr pr = bitmap.GetHbitmap();
                        Image MyImage = Image.FromHbitmap(pr);
                        DeleteObject(pr);
                        //
                        byte[] tmpbyte = CompressByte(imageToByteArray(MyImage));//转换为字节压缩。
在另外一台17寸电脑上操作更是消耗 860MS。求高效方法,DirecxX ,差异截图 等方法

解决方案 »

  1.   

    http://topic.csdn.net/u/20090911/14/5614a16e-ab08-4106-901e-e8dcc5cd1fa3.html?8513
      

  2.   

    类库自带的 g.CopyFromScreen( 跟上面的效率差不多。
      

  3.   

    使用 DirectX 截图 GetFrontBufferData(0, mySurface)  应用程序错误。。
      

  4.   

     Microsoft.DirectX.Direct3D.Device myDevice;
              
                PresentParameters presentParams = new PresentParameters();
                presentParams.Windowed = true;
                presentParams.AutoDepthStencilFormat = DepthFormat.D16;            presentParams.SwapEffect = SwapEffect.Discard;
                presentParams.PresentFlag = PresentFlag.LockableBackBuffer;
                presentParams.BackBufferWidth = 1280;
                presentParams.BackBufferHeight = 800;
                presentParams.MultiSample = MultiSampleType.None;
                presentParams.BackBufferCount = 1;
                //   presentParams.DeviceWindowHandle = this.Handle;
                for (int i = 0; i < 100; i++)
                {
                                   string datetime = DateTime.Now.ToString("HH:mm:ss:ff");
                    myDevice = new Device(0, DeviceType.Hardware, this, CreateFlags.SoftwareVertexProcessing, presentParams);
                    Surface mySurface = myDevice.CreateOffscreenPlainSurface(1280, 800, Format.A8R8G8B8, Pool.SystemMemory);
                    try
                    {
                        myDevice.GetFrontBufferData(0, mySurface); //copy frontsurface to mySurface                    Microsoft.DirectX.GraphicsStream gStr = Microsoft.DirectX.Direct3D.SurfaceLoader.SaveToStream(ImageFileFormat.Bmp, mySurface);
                        // pictureBox1.Image = Bitmap.FromStream(gStr);
                        Bitmap screen = new Bitmap(Bitmap.FromStream(gStr));
                        gStr.Dispose();
                        mySurface.Dispose();
                    }
                    catch (Exception ee)
                    {
                        Tools.Trace(ee.ToString());
                        mySurface.Dispose();
                    }
                    string datetime2 = DateTime.Now.ToString("HH:mm:ss:ff");
                               }
    使用的DX,速度也差不多 = =。请问是哪的使用问题吗
      

  5.   


     Image deskImage = new Bitmap(Screen.PrimaryScreen.Bounds.Width, Screen.PrimaryScreen.Bounds.Height, PixelFormat.Format24bppRgb);
                    Graphics deskG = Graphics.FromImage(deskImage);
                    deskG.CopyFromScreen(new Point(0, 0), new Point(0, 0), Screen.PrimaryScreen.Bounds.Size);                Rectangle targRect = new Rectangle(0, 0,640, 480);
                    Image baseImage = new Bitmap(640, 480, PixelFormat.Format24bppRgb);
                    Graphics baseG = Graphics.FromImage(baseImage);
                    baseG.DrawImage(deskImage, targRect, new Rectangle(0, 0, deskImage.Width, deskImage.Height), GraphicsUnit.Pixel);
      

  6.   

    graphic.DrawImage(im, 0, 0, new Rectangle(x, y, width, height), GraphicsUnit.Pixel);
      //从作图区生成新图
      IntPtr pr = bitmap.GetHbitmap();
      Image MyImage = Image.FromHbitmap(pr);
      DeleteObject(pr);-------------------
    graphic.DrawImage(im, 0, 0, new Rectangle(x, y, width, height), GraphicsUnit.Pixel);
    Image MyImage =bitmap;
    bitmap.dispose; '释放截屏可用:
    graphic.CopyFromScreen(..)
      

  7.   

    上面的释放方式运行段时间就会出错。
    CopyFromScreen()效果和API差不多。。
      

  8.   

    http://topic.csdn.net/u/20090911/14/5614a16e-ab08-4106-901e-e8dcc5cd1fa3.html?44754