Exemplo n.º 1
0
        /**更新关键帧*/
        private void upDateKeyFrame(Bitmap newKeyFrame, ShortPoint point)
        {
            globalComparerBitmap = (Bitmap)newKeyFrame.Clone();

            DifferentBitmapWithCursor differentBitmapWithCursor = new ScreenBitmap.DifferentBitmapWithCursor();

            differentBitmapWithCursor.setBitmapType(SendPacket.BitmapType.COMPLETE);
            differentBitmapWithCursor.setCursorPoint(point);
            differentBitmapWithCursor.setDifBitmap(newKeyFrame);
            screenCopyDifQueue.Enqueue(differentBitmapWithCursor);
            textBoxDBQ.Text = "" + screenCopyDifQueue.getQueueSize();
        }
Exemplo n.º 2
0
        private void bitmapCmpToBlockingQueue()
        {
            while (isSendPic)
            {
                while (!picFlag)
                {
                    try
                    {
                        manulResetEvent.WaitOne();
                    }
                    catch (ThreadInterruptedException ex)
                    {
                        manulResetEvent.Reset();
                        Console.WriteLine(ex.Message);
                        ErrorInfo.getErrorWriter().writeErrorMassageToFile(ex.Message);
                        return;
                    }
                }
                while (picFlag)
                {
                    BitmapWithCursor bitmapWithCursor = screenCopyQueue.Dequeue();

                    if (bitmapWithCursor != null)
                    {
                        // Console.WriteLine("btmCmpThread***********");
                        try
                        {
                            //发送关键帧,校准
                            //keyFrameAdjusttimes++;
                            //if (keyFrameAdjusttimes > 300)
                            //{
                            //    keyFrameAdjusttimes = 0;
                            //    sendKeyFrame();
                            //}
                            Bitmap btm1 = bitmapWithCursor.getScreenBitmap();

                            if (isFirstFrame)
                            {
                                globalBtmWidth  = btm1.Width;
                                globalBtmHeight = btm1.Height;
                                upDateKeyFrame(btm1, bitmapWithCursor.getCursorPoint());
                                isFirstFrame = false;
                            }
                            else
                            {
                                int lastBtmWidth  = btm1.Width;
                                int lastBtmHeight = btm1.Height;
                                if (lastBtmWidth != globalBtmWidth || lastBtmHeight != globalBtmHeight)
                                {
                                    globalBtmWidth  = lastBtmWidth;
                                    globalBtmHeight = lastBtmHeight;
                                    upDateKeyFrame(btm1, bitmapWithCursor.getCursorPoint());
                                    continue;
                                }
                                Bitmap btm2 = globalComparerBitmap;

                                List <ShortRec> difPoints = null;
                                if (isWin8Above)
                                {
                                    // Stopwatch sw = new Stopwatch();
                                    //sw.Start();
                                    difPoints = BitmapCmp32Bit.Compare(bitmapWithCursor.dirtyRecs, btm2, btm1, bitCmpSize);
                                    //sw.Stop();
                                    //Console.WriteLine(sw.ElapsedMilliseconds+"ms");
                                }
                                else
                                {
                                    difPoints = BitmapCmp24Bit.Compare(btm1, btm2, bitCmpSize);
                                }
                                Bitmap sendPic = null;
                                if (difPoints.Count > 0)
                                {
                                    DifferentBitmapWithCursor differentBitmapWithCursor = new ScreenBitmap.DifferentBitmapWithCursor();
                                    double VPTNOW = (double)(CopyScreen.getReslution().Width *CopyScreen.getReslution().Height) / (bitCmpSize.Width * bitCmpSize.Height);
                                    if ((double)difPoints.Count >= VPT07 * VPTNOW)//超过70%的改变,直接发送K帧
                                    {
                                        sendPic = btm1;
                                        differentBitmapWithCursor.setBitmapType(SendPacket.BitmapType.COMPLETE);
                                    }
                                    else
                                    {
                                        //Stopwatch sw = new Stopwatch();
                                        //sw.Start();
                                        sendPic = GetDifBlocks.getBlocksIn1BitmapClone(difPoints, btm1, bitCmpSize);
                                        //sw.Stop();
                                        //Console.WriteLine(sw.ElapsedMilliseconds+"ms");
                                        differentBitmapWithCursor.setBitmapType(SendPacket.BitmapType.BLOCK);
                                        differentBitmapWithCursor.setDifPointsList(difPoints);
                                    }
                                    /**更新全局比较帧*/
                                    globalComparerBitmap.Dispose();
                                    globalComparerBitmap = (Bitmap)btm1.Clone();
                                    differentBitmapWithCursor.setCursorPoint(bitmapWithCursor.getCursorPoint());
                                    differentBitmapWithCursor.setDifBitmap(sendPic);


                                    screenCopyDifQueue.Enqueue(differentBitmapWithCursor);
                                    textBoxDBQ.Text = "" + screenCopyDifQueue.getQueueSize();
                                }
                            }
                        }
                        catch (Exception ex)
                        {
                            Console.WriteLine(ex.Message);
                            ErrorInfo.getErrorWriter().writeErrorMassageToFile(ex.Message);
                            return;
                        }
                    }
                }
            }
        }