C# Скриншот экрана
От: head-dron  
Дата: 29.10.10 06:11
Оценка:
Необходимо сделать скриншот экрана.
Когда начал делать, делал через CopyFromScreen. То есть вот такой метод получился.

public static Bitmap ScreenShot(Screen screen)
{
       Bitmap bmp = new Bitmap(screen.Bounds.Width, screen.Bounds.Height, PixelFormat.Format32bppArgb);
       Graphics graph = Graphics.FromImage(bmp);
       graph.CopyFromScreen(screen.Bounds.X, screen.Bounds.Y, 0, 0, screen.Bounds.Size, CopyPixelOperation.SourceCopy);
       return bmp;
}


То есть делаю слепок с какого то определенного экрана. Но нужно делать со всех, тогда вот начал делать метод, который снимает со всех экранов и склеивает полученные Bitmap'ы в один большой Bitmap. И тут же столкнулся с проблемой: В классе Screen я не нашел в каком порядке расположены экраны. То есть смысл в том чтобы склеить все Bitmap'ы так как они есть на экранах, в тех же положениях.
То есть если экраны расположены так:

1 1 1
1
1 1

то и склеить их в таком же порядке.

В какую сторону в этом случае смотреть?
Re: C# Скриншот экрана
От: samius Япония http://sams-tricks.blogspot.com
Дата: 29.10.10 06:31
Оценка:
Здравствуйте, head-dron, Вы писали:

HD>В какую сторону в этом случае смотреть?


В сторону сортировки
Re[2]: C# Скриншот экрана
От: head-dron  
Дата: 29.10.10 07:17
Оценка:
Здравствуйте, samius, Вы писали:

S>Здравствуйте, head-dron, Вы писали:


HD>>В какую сторону в этом случае смотреть?


S>В сторону сортировки


Хорошо. А что если помимо главного экрана есть один сверху и один справа. Как узнать что тот что сверху, именно сверху? Об этом информации в Screen нету. Да и не узнать никак.
Re: C# Скриншот экрана
От: Аноним  
Дата: 29.10.10 07:20
Оценка:
Здравствуйте, head-dron, Вы писали:

HD>Необходимо сделать скриншот экрана.

HD>Когда начал делать, делал через CopyFromScreen. То есть вот такой метод получился.

Контроль за действиями сотрудников?
Re[3]: C# Скриншот экрана
От: samius Япония http://sams-tricks.blogspot.com
Дата: 29.10.10 07:22
Оценка:
Здравствуйте, head-dron, Вы писали:

HD>Здравствуйте, samius, Вы писали:


S>>Здравствуйте, head-dron, Вы писали:


HD>>>В какую сторону в этом случае смотреть?


S>>В сторону сортировки


HD>Хорошо. А что если помимо главного экрана есть один сверху и один справа. Как узнать что тот что сверху, именно сверху? Об этом информации в Screen нету. Да и не узнать никак.


А что на счет screen.Bounds?
Re[4]: C# Скриншот экрана
От: head-dron  
Дата: 29.10.10 07:32
Оценка:
Здравствуйте, samius, Вы писали:

S>Здравствуйте, head-dron, Вы писали:


HD>>Здравствуйте, samius, Вы писали:


S>>>Здравствуйте, head-dron, Вы писали:


HD>>>>В какую сторону в этом случае смотреть?


S>>>В сторону сортировки


HD>>Хорошо. А что если помимо главного экрана есть один сверху и один справа. Как узнать что тот что сверху, именно сверху? Об этом информации в Screen нету. Да и не узнать никак.


S>А что на счет screen.Bounds?


Не увидел там нужной информации. Разве что может ли являться "screen.Bounds.Location" координаты именно относительно всех экранов?
Re[2]: C# Скриншот экрана
От: head-dron  
Дата: 29.10.10 07:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, head-dron, Вы писали:


HD>>Необходимо сделать скриншот экрана.

HD>>Когда начал делать, делал через CopyFromScreen. То есть вот такой метод получился.

А>Контроль за действиями сотрудников?

Нет. )) Личные цели
Re[5]: C# Скриншот экрана
От: samius Япония http://sams-tricks.blogspot.com
Дата: 29.10.10 07:36
Оценка:
Здравствуйте, head-dron, Вы писали:

HD>Здравствуйте, samius, Вы писали:


S>>Здравствуйте, head-dron, Вы писали:


HD>>>Хорошо. А что если помимо главного экрана есть один сверху и один справа. Как узнать что тот что сверху, именно сверху? Об этом информации в Screen нету. Да и не узнать никак.


S>>А что на счет screen.Bounds?


HD>Не увидел там нужной информации. Разве что может ли являться "screen.Bounds.Location" координаты именно относительно всех экранов?


Этой информации разве не достаточно?

graph.CopyFromScreen(screen.Bounds.X, screen.Bounds.Y, 0, 0, screen.Bounds.Size, CopyPixelOperation.SourceCopy);

Graphics как-то находит, откуда копировать?
Re[3]: C# Скриншот экрана
От: Аноним  
Дата: 29.10.10 07:39
Оценка:
Здравствуйте, head-dron, Вы писали:

HD>Здравствуйте, Аноним, Вы писали:


А>>Здравствуйте, head-dron, Вы писали:


HD>>>Необходимо сделать скриншот экрана.

HD>>>Когда начал делать, делал через CopyFromScreen. То есть вот такой метод получился.

А>>Контроль за действиями сотрудников?

HD>Нет. )) Личные цели

Тогда я не протиф

Нинавввижу «этих»
Re[6]: C# Скриншот экрана
От: head-dron  
Дата: 29.10.10 07:42
Оценка:
Здравствуйте, samius, Вы писали:

S>Этой информации разве не достаточно?

S>

S>graph.CopyFromScreen(screen.Bounds.X, screen.Bounds.Y, 0, 0, screen.Bounds.Size, CopyPixelOperation.SourceCopy);

S>Graphics как-то находит, откуда копировать?

То есть screen.Bounds.X это координата относительно всех экранов?
Re[7]: C# Скриншот экрана
От: samius Япония http://sams-tricks.blogspot.com
Дата: 29.10.10 07:44
Оценка:
Здравствуйте, head-dron, Вы писали:

HD>То есть screen.Bounds.X это координата относительно всех экранов?


Затрудняюсь ответить, непонимаю что значит "относительно всех экранов".
Re: C# Скриншот экрана
От: MozgC США http://nightcoder.livejournal.com
Дата: 29.10.10 07:46
Оценка:
Получаете массив всех дисплеев и смотрите их координаты (Screen.Bounds), и в зависимости от координат соответствующе их "клеите".
Re[8]: C# Скриншот экрана
От: head-dron  
Дата: 29.10.10 07:52
Оценка:
Здравствуйте, samius, Вы писали:

S>Здравствуйте, head-dron, Вы писали:


HD>>То есть screen.Bounds.X это координата относительно всех экранов?


S>Затрудняюсь ответить, непонимаю что значит "относительно всех экранов".


На примере массива:

1 1 1
1
1 1
1 1
1

9 экранов.

Дак вот. Допустим позиция центрального в массиве x=1, y=1. Хранится ли то же самое в screen.Bounds.X и screen.Bounds.Y соответственно? Или же там всегда хранится начальная координата относительно выбранного Screen'а (то есть 0, 0)?
Re[9]: C# Скриншот экрана
От: samius Япония http://sams-tricks.blogspot.com
Дата: 29.10.10 07:55
Оценка:
Здравствуйте, head-dron, Вы писали:

HD>Здравствуйте, samius, Вы писали:


S>>Здравствуйте, head-dron, Вы писали:


HD>>>То есть screen.Bounds.X это координата относительно всех экранов?


S>>Затрудняюсь ответить, непонимаю что значит "относительно всех экранов".


HD>На примере массива:


HD>1 1 1

HD>1 1 1
HD>1 1 1

HD>9 экранов.


HD>Дак вот. Допустим позиция центрального в массиве x=1, y=1. Хранится ли то же самое в screen.Bounds.X и screen.Bounds.Y соответственно? Или же там всегда хранится начальная координата относительно выбранного Screen'а (то есть 0, 0)?


Там хранятся не координаты скринов в матрице скринов, а прямоугольники скринов в общей системе координат-пикселей. AFAIR начало системы координат — левый верхний угол праймари скрина.

И вообще клеить ничего не надо. Нужно создать большой битмап и в цикле по скринам скопировать в него области соответствующих скринов на соответствующее место. Только нужно учесть, что координаты прямоугольников скринов могут быть отрицательные.
Re[10]: C# Скриншот экрана
От: head-dron  
Дата: 29.10.10 08:05
Оценка:
S>Там хранятся не координаты скринов в матрице скринов, а прямоугольники скринов в общей системе координат-пикселей. AFAIR начало системы координат — левый верхний угол праймари скрина.

S>И вообще клеить ничего не надо. Нужно создать большой битмап и в цикле по скринам скопировать в него области соответствующих скринов на соответствующее место. Только нужно учесть, что координаты прямоугольников скринов могут быть отрицательные.


То есть как я понял если у основного скрина координата 0, 0. То у того что слева от него будет уже допустим -1024, 0 ??
Re[10]: C# Скриншот экрана
От: head-dron  
Дата: 29.10.10 08:40
Оценка:
А ведь можно же схитрить. Если мне в любом случае нужны все скрины на одном битмапе, то почему бы сразу все и не заснапить?
Допустим вычислить через цикл самую мелкую и самую крупную координату у скринов и потом подставить в CopyFromScreen.

Вот по быстрому набросал:

        public void GlobalPoints(out Point first, out Point last)
        {
            int FX = 0, FY = 0, LX = 0, LY = 0;
            int scrFX, scrFY, scrLX, scrLY;

            foreach (Screen screen in Screen.AllScreens)
            {
                scrFX = screen.Bounds.X;
                scrFY = screen.Bounds.Y;
                scrLX = screen.Bounds.X + screen.Bounds.Width;
                scrLY = screen.Bounds.Y + screen.Bounds.Height;
                if (FX > scrFX) FX = scrFX;
                if (FY > scrFY) FY = scrFY;
                if (LX < scrLX) LX = scrLX;
                if (LY < scrLY) LY = scrLY;
            }

            LX += Abs(FX);
            LY += Abs(FY);

            first = new Point(FX, FY);
            last = new Point(LX, LY);
        }


И сделать потом

graph.CopyFromScreen(first.X, first.Y, 0, 0, new Size(last), CopyPixelOperation.SourceCopy);


А размер битмапа вот такой сделать

Bitmap bmp = new Bitmap(Abs(first.X) + Abs(last.X), Abs(first.Y) + Abs(last.Y));



Проверить пока не могу, только в теории все.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.