Beispiel #1
0
        static void MonitorScreenshots()
        {
            var outDir = @"t:\Data\Gumball\Screenshots";


            var vm_title = "BlueStacks";

            var handle = DirectGamer.FindWindow(null, vm_title);

            if (handle == IntPtr.Zero)
            {
                throw new Exception("Окно не найдено");
            }

            DirectGamer.RECT rect;
            DirectGamer.GetWindowRect(handle, out rect);
            Console.WriteLine($"{rect.Right - rect.Left} {rect.Bottom - rect.Top}");

            var hashes = new Dictionary <Shipwreck.Phash.Digest, int>(new DigestComparer());

            Shipwreck.Phash.Digest prevHash = null;

            for (var i = 0; ; i++)
            {
                var screenshot = DirectGamer.GetScreenImage(new System.Drawing.Rectangle(rect.Left, rect.Top, rect.Right - rect.Left, rect.Bottom - rect.Top));

                var hash = ComputeDigest(screenshot);
                //var isOther = prevHash == null || Shipwreck.Phash.ImagePhash.GetCrossCorrelation(prevHash, hash) < 1;
                var isOther = prevHash == null || hashes.Keys.All(_hash => ImagePhash.GetCrossCorrelation(_hash, hash) < 1);
                if (isOther)
                {
                    screenshot.Save(System.IO.Path.Combine(outDir, $"{DateTime.UtcNow:yyMMdd.HHmmss}.png"));
                }
                //System.IO.File.WriteAllBytes(System.IO.Path.Combine(outDir, $"{DateTime.UtcNow:yyMMdd.HHmmss}.png"), stream.ToArray());
                Console.WriteLine($"{i:d4} {hash} - {(isOther ? "saved" : "skipped")}");
                prevHash     = hash;
                hashes[hash] = (hashes.ContainsKey(hash) ? hashes[hash] : 0) + 1;

                System.Threading.Thread.Sleep(TimeSpan.FromSeconds(0.1));
            }
        }
Beispiel #2
0
        //C:\Users\Serge\AppData\Local\Android\sdk\platform-tools >  adb start-server
        //adb devices -- посмотреть список устройств
        //adb kill-server -- с последующим start-server, помогает увидеть blue-stacks
        //
        //посмотреть текущее разрешение
        //adb shell dumpsys displays
        //https://stackoverflow.com/questions/7527459/android-device-screen-size
        static void Main(string[] args)
        {
            NitroBolt.CommandLine.CommandLineManager.Process(args, typeof(Program).Assembly);
            return;

            Task.Run(OrleansServer.Execute).Wait();
            return;

            Processor.ToHsv();
            return;

            Walker.Execute();
            return;

            if (true)
            {
                var filenames = new[]
                {
                    @"t:\Data\Jewel\Screenshots\180721.004138.png",
                    @"t:\Data\Jewel\Screenshots\180709.010322.png",
                    @"t:\Data\Jewel\Screenshots\180709.010049.png",
                    @"t:\Data\Jewel\Screenshots\180709.005842.png",
                    @"t:\Data\Jewel\Screenshots\180709.005615.png",
                    @"t:\Data\Jewel\Screenshots\180709.005604.png",
                };

                foreach (var filename in filenames)
                {
                    var(h, s, v) = Imager.ToHsv(filename);
                    Console.WriteLine($"{h}, {s}, {v}");
                }
            }
            //GOcr.ToPerception();
            //GOcr.Execute();
            return;

            //return;
            Perception();
            return;

            MonitorScreenshotsByAdb();
            return;

            var screenshot1 = AdbScreenCapture();

            System.IO.File.WriteAllBytes("screen -capture.png", screenshot1);
            return;

            MonitorScreenshots();
            return;

            PhashExecuting();
            return;

            SaveMazeCellImages();
            return;

            var vm_title = "BlueStacks";

            var handle = DirectGamer.FindWindow(null, vm_title);

            if (handle == IntPtr.Zero)
            {
                throw new Exception("Окно не найдено");
            }

            //DirectGamer.PostMessage(new System.Runtime.InteropServices.HandleRef(null, handle), DirectGamer.WM_SIZE, new IntPtr(0), new IntPtr((1200 << 16) + 600));

            DirectGamer.RECT rect;
            DirectGamer.GetWindowRect(handle, out rect);
            Console.WriteLine($"{rect.Right - rect.Left} {rect.Bottom - rect.Top}");
            var screenshot = DirectGamer.GetScreenImage(new System.Drawing.Rectangle(rect.Left, rect.Top, rect.Right - rect.Left, rect.Bottom - rect.Top));

            screenshot.Save("gumballs.screenshot.png");

            var screenWidth  = 900;
            var screenHeight = 1600;
            var headerHeight = 40;
            var footerHeight = 40;

            var cellWidth = 167;
            //var cellHeight = 180;
            var cellHeight = 156;
            var mazeX      = 30;
            var mazeY      = 277;

            if (true)
            {
                var dx = screenshot.Width / (float)screenWidth;
                var dy = (screenshot.Height - headerHeight - footerHeight) / (float)screenHeight;

                var image = new Bitmap(screenshot);
                using (var g = Graphics.FromImage(image))
                {
                    var pen = new Pen(Color.Red);

                    Action <Pen, float, float, float, float> drawLine = (p, x1, y1, x2, y2) => g.DrawLine(p, x1 * dx, y1 * dy + headerHeight, x2 * dx, y2 * dy + headerHeight);

                    for (var y = 0; y <= 6; ++y)
                    {
                        drawLine(pen, mazeX, mazeY + y * cellHeight, mazeX + cellWidth * 5, mazeY + y * cellHeight);
                    }
                    for (var x = 0; x <= 5; ++x)
                    {
                        drawLine(pen, mazeX + x * cellWidth, mazeY, mazeX + x * cellWidth, mazeY + 6 * cellHeight);
                    }
                }
                image.Save("gumballs.lines.png");
            }


            return;

            //DirectGamer.PostMessage(new System.Runtime.InteropServices.HandleRef(null, handle), DirectGamer.WM_LBUTTONDOWN, new IntPtr(DirectGamer.MK_LBUTTON), new IntPtr((100 << 16) + 100));
            if (true)
            {
                // 2 4 ?? дверь, не сработала
                var x = 0;
                var y = 4;
                Shell($"input tap {mazeX + cellWidth / 2 + x * cellWidth} {mazeY + cellHeight/2 + y * cellHeight}"); //maze cell 1 2
            }
            //screenshot: cell 1 2: 110 322 - 206 426
            //Shell("input tap 193 620"); //maze cell 0 2

            //Shell($"input tap 365 {787 + cellHeight}"); //maze cell 1 2
            //Shell("input tap 193 599"); //maze cell 2 2

            //Shell("input tap 194 600"); //maze cell 1 2
            //Shell("input tap 364 786"); //maze cell 1 2

            //Shell("input tap 365 787"); //maze cell 2 3
            return;

            //Shell($"input tap 10 800"); //maze рамка
            //Shell($"input tap 20 850"); //maze рамка
            //Shell($"input tap 25 850"); //maze cell 0 3
            //Shell("input tap 20 50"); //левый верхний угол
            //Shell("input tap 100 300"); //maze cell 0 0
            //Shell($"input tap 170 620"); //maze cell 0 2
            //Shell($"input tap 300 800"); //maze cell 1 3
            //Shell("input tap 500 300"); //maze cell 2 0
            //Shell("input tap 700 300"); //maze cell 3 0
            //Shell("input tap 650 300"); //maze cell 3 0
            //Shell("input tap 600 300"); //maze cell 3 0

            //Shell("input tap 750 300"); //maze cell 4 0
            Shell("input tap 800 300"); //maze cell 4 0
            //Shell("input tap 900 300"); //вне экрана

            //Shell("input tap 800 300"); //maze cell 3 0
            //Shell("input tap 00 300"); //maze cell 3 0
            return;

            return;

            Shell("input keyevent 4");//back кнопка
            Shell("input keyevent 4");
        }