Delphi 6 скриншоты


Delphi 6 скриншоты

Необходимо за минимальное время получить весь RGB массив данных текущего состояния экрана.
GetDiBits при моих условиях даёт порядка 24 мс, что неприемлимо :(

Какие помимо этого существуют методы?


> Какие помимо этого существуют методы?

Драйвер свой. Как у Remote Administartor. Подробнее к сожалению не знаю.

> GetDiBits при моих условиях даёт порядка 24 мс, что неприемлимо :(

А тебе точно DIB нужен? Если можно обойтись DDB, время снижаеться милиисекунд до 5-и наверное :)

Может, BitBlt будет побыстрее, особенно если установить формат буфера = формату рабочего стола, но вряд ли намного.
Относительно драйверов см. Фень Юаня:
http://irazin.ru/Downloads/Books/Yuan.rar

homm,
Мне нужно периодически получать массив данных пригодный для постобработки и хранения в файле :)

Sapersky, BitBlt сбрасывает на контекст. года 3 назад как-то делал указатель на данные контекста, вспомнить вот не могу :)
За книжку огромное спасибо, думаю найду в ней массу полезного!

> года 3 назад как-то делал указатель на данные контекста,
> вспомнить вот не могу :)

И не вспомнишь, т.к. контекст этот области в памяти видеодкарты.

homm, неужели? А как же аппаратная независимость GDI? )

> А как же аппаратная независимость GDI?

Ну вот и независимость в том и есть, что ты до апаратной части добраться не сможешь. Это же не указатель на видеопамять, а контекст этого указателя. Что-бы получить указатель на данные этого контеста, в любом случае нужена передача данных в ОП. Посмоти реализацию TBitmap.ScanLines в VCL.

CreateDIBSection + BitBlt даёт 15 мс. Уже лучше, но можно ли быстрее не прибегая к DX или «самописным драйверам»? :)

uses
Windows, SysUtils;

type
TScr = array [0..1] of Byte;
PScr = ^TScr;
var
hBmp : hBitmap;
DeskDC : hDC;
DC : hDC;
BFH : tagBITMAPFILEHEADER;
BIH : tagBITMAPINFO;
ScrX, ScrY : Integer;
F : File;
ScrSize : Cardinal;
Bits : Pointer;
t : LongWord;
i : Integer;
begin
DeskDC := GetDC(0);

ScrX := GetDeviceCaps(DeskDC, HORZRES);
ScrY := GetDeviceCaps(DeskDC, VERTRES);
ScrSize := ScrX * ScrY * 4;

with BFH do
begin
bfType := $4D42;
bfSize := ScrSize + SizeOf(BFH) + SizeOf(BIH);
bfReserved1 := 0;
bfReserved2 := 0;
bfOffBits := SizeOf(BFH) + SizeOf(BIH);
end;

with BIH.bmiHeader do
begin
biSize := SizeOf(BIH);
biW > biHeight := SCRY;
biPlanes := 1;
biBitCount := 32;
biCompression := BI_RGB;
biSizeImage := ScrSize;
biClrImportant := 0;
end;

GetMem(Bits, ScrSize);
hBmp := CreateDIBSection(DeskDC, BIH, DIB_RGB_COLORS, Bits, 0, 0);
DC := CreateCompatibleDC(DeskDC);
SelectObject(DC, hBmp);

t := GetTickCount;
for i := 0 to 9 do
begin
BitBlt(DC, 0, 0, ScrX, ScrY, DeskDC, 0, 0, SRCCOPY);
<
AssignFile(F, «src» + IntToStr(i) + «.bmp»);
Rewrite(F, 1);
Blockwrite(F, BFH, SizeOf(BFH));
Blockwrite(F, BIH, SizeOf(BIH));
Blockwrite(F, bits^, ScrSize);
CloseFile(F);
>
end;
writeln((GetTickCount — t)/10:2:2);
readln;

GetTickCount не очень точно, для таких малых интервалов, лучше QueryPerformanceCounter

DVM, 150 мс +/- 20 мс точности, не так страшно. причём для 100 скриншотов эта цифра в 15 мс практически не изменяется.

XProger © (05.05.07 06:52) [9]
GetMem(Bits, ScrSize); — вот этого не надо, CreateDIBSection сама выделяет память.
Ещё у меня на Win98 не хотело работать, пока не поставил
biSize := SizeOf(BIH.header); // 40 байт, а SizeOf(BIH) — 44

но можно ли быстрее не прибегая к DX

По моим тестам DX (DirectDraw) в данном случае никакого эффекта не даёт. Скорость такая же, что и с CreateDIBSection/BitBlt.

Sapersky, спасибо за информацию, выделение памяти это пережитки GetDiBits :)

Как сделать скриншот формы?

Вопрос

Вячеслав 32

Вячеслав 32

  • Продвинутый пользователь
  • Пользователи
  • 32
  • 127 сообщений

Господа, озадачился вопросом получения скриншота формы. Статью Ярослава прочитал, разобрался, но в ней описан метод получения скриншота произвольного контрола с помощью метода PainTo. У формы же этот метод иной, поэтому возникли затруднения.

Поделиться сообщением

Ссылка на сообщение
Поделиться на другие сайты

2 ответа на этот вопрос

Рекомендуемые сообщения

Похожий контент

Добрый день, друзья. Подскажите, есть ли возможность в firemonkey открыть форму как представлено на картинке ниже? Если да, то подскажите в какую сторону копать. Спасибо.

Библиотека для работы с изображениями находится здесь.

Мне нужно сделать снимок экрана из своего приложения в приложении DirectX (в игре).
По-быстрому накидал приложение, исходники здесь: MakeScreenshot-Forum.zip

1. по нажатию единственной кнопки будет выполнена серия из 16 снимков экрана. Если запущен Скайп, то фотографироваться будет содержимое его окна.
2. По нажатии CTRL+ALT+F9 будет сделан единичный снимок
3. Label внизу показывает сколько миллисекунд затрачено на вывод снимка
4. В комментах так же вы найдете, как работать со снимками через буфер обмена.

Работа выполняется через GetDC(NULL);
Windows 10 x64. Снимки делаются. И DirectX тоже нормально фотографируется.
НО! только в оконных приложениях.
Если приложение DirectX полноэкранное, то на всех снимках одна и та же картинка с первого снимка.
То есть изменение буфера экрана в приложении ни как не отражается на снимках.

Что нужно? Необходимо делать снимки конкретного приложения через интерфейс DirectX, а точнее, я так понимаю, через DirectShow. Тогда не будет разницы в окне оно или на полный экран.
Помогите плиз, знающие люди, с решением этой задачи.
Гарантирую вам от сообщества большой почет, от меня огромный респект, если это принесет доход, то еще и очень приятный бонус.

Ссылки теме:
1. DIRECTX FOR DELPHI
2. unofficial version of DelphiX
3. DirectX для начинающих
4. MinHook — The Minimalistic x86/x64 API Hooking Library
5. Various methods for capturing the screen
6. Вывод графики на рабочий стол Windows с использованием оверлеев DirectX
7. Project JEDI
8. Реализация перехвата вызовов API — исчерпывающе про внедрение DLL, если разобраться, + это на Delphi
UPD:
9. Серия видео уроков Пишем D3D-хук — все понятно, только в Delphi перенести нужно.
UPD 2:
Научился рисовать в Direct3D и ловить интерфейс IDirect3DDevice9. Теперь делаю DLL ловушку для реализации снимков.

Для проведения опытов на Delphi XE8 использовал два планшета Android:
— Lenovo TAB S8-50LC на базе процессора Intel Atom Z3745: http://www.ixbt.com/portopc/lenovo-tab-s8-50lc.shtml. На нем установлен Android версии 4.4.2. Подключил к USB и, как не странно, тестовая программка «Hello World!» успешно запустилась, хотя думал, что с процессором Intel вообще ничего не получится;


— Prestigio Multipad PMT5777_3G с процессором ARM MediaTek MT8382. На нем установлен Android 4.2.2.

Затем на форму красного цвета бросил зеленый TRectangle, присвоил Align значение Client, а также добавил желтую рамку с помощью свойства Stroke (Thinkness=10). Запустил на Prestigio — выглядит нормально, если не считать не дорисованных уголков (см. красные квадраты). Кстати, на Windows уголки рамки отображаются нормально.

MainForm.Top = 25 — видимо, смещение от статус-бара.

Затем запустил на Lenovo и результат получился не такой красивый. Как видим, верх формы почему-то «уехал» за статус-бар, а ее свойство Top равно 0:

Поворачиваем планшеты на 90 градусов. На Prestigio все выглядит нормально:

На Lenovo произошло какое-то расстройство:

Как я понял, на Lenovo возникают проблемы с получением высоты статус-бара и размеров экрана при повороте планшета, но с чем это связано — непонятно. Возможно решение где-то в FMX.Platform.Android или глубже. По крайней мере там переменная FStatusBarHeight равна нулю.

На моем примере ниже можно получить правильные размеры и позицию для формы (в т.ч. с учетом статус-бара):
NativeWin := SharedActivity.getWindow;
if NativeWin <> nil then
begin
ContentRect := TJRect.Create;
DecorView := NativeWin.getDecorView;
DecorView.getWindowVisibleDisplayFrame(ContentRect);
end;

На Android код, который работает исправно на Win вызывает ошибку «CalledFromWrongThreadException: Only the original thread that created a view hierarcy can touch its views»
Смысл таков, что я пытаюсь показать форму из треда, у которой BorderStyle=none (роли это не играет).
Решение в Андроиде заключается в том, чтобы пускать через runOnUiThread (то есть выполнять интерфейсные штуки в главном потоке). Как я понимаю, в firemonkey эту фичу должен выполнять Synchronize().
Тем не менее, ошибка возникает.
А при запуске в режиме дебага на андроид девайсе событие кнопки вообще не срабатывает иногда. А если срабатывает, то возникает описанное выше исключение.
Я собрал тестовый пример и в нем не сразу видна ошибка, тогда как получил я ее на рабочем проекте.
Цель: показать бизибокс на время бекграундных действий. Этот бизибокс у меня сначала был просто на каждой форме и я интерфейсно его вызывал, но теперь решил сделать отедльной формой (как и тоаст), но почему так происходит я не понял. Вы что скажете?

unit Unit1; interface uses System.SysUtils, System.Types, System.UITypes, System. >

Пожалуйста, развейте мои сомнения, люди добрые!
Не верю глазам своим. Сомневаюсь.
Неужели это правда, что работая в дизайнере в иерархии элементов формы Structure нельзя не только ничего переместить, но и уничтожить?

Обнаружилась очень неприятная и неожиданная проблема.
Постараюсь кратко описать суть. Есть приложение (пробовал пока только на Windows) для работы с базой данных. Допустим мы создаем новый объект этой базы. Открывается форма этого объекта. При заполнении значений определенного реквизита (допустим это цвет) открывается форма выбора из списка цветов, введенных в эту базу данных. Форма выбора открывается в модальном режиме. В этой форме выбора есть возможность добавить новый или изменить уже существующий цвет. Соответственно поверх модальной формы открывается еще одна модальная форма редактирования цвета. Пока все хорошо. Но при закрытии формы цвета форма выбора заполняется черным цветом (сначала только частично, т. к. перерисовывается не вся форма, а только часть объектов, которые были перекрыты второй модальной формой, но, например, при ресайзе формы выбора чернеет уже вся клиентская часть). Все формы в приложении стилизованные, включая бордюр.
Частично эта проблема решается если у форм устанавливать Fill.Kind в Solid или что-то другое (главное, чтобы не None). Но при этом начинают странным образом пропадать элементы формы (без логики). Пробовал мудрить, типа в OnActivate формы выбора сбрасывать StyleBook формы, далее Application.ProcessMessages, и снова устанавливать в StyleBook новое значение. После пары перемигиваний форма отрисовывается правильно, но при этом появляется другой глюк (при наведении на кнопки в заголовке главной формы, заголовок тоже чернеет). Вот такая дребедень.

В общем, как я понимаю, глюк появляется, когда открыто несколько модальных форм.

Может кто-то знает какой-нибудь приличный workaround?

Подскажите как можно изменить иконку окна в runtime?
Суть проблемы в том, что мне надо поддерживать приложение для разных заказчиков. Каждый из них хочет иметь собственную иконку в приложении. Очевидное решение — создать несколько проектов и каждому задать требуемую иконку. Однако на практике это весьма утомительное занятие. Хотелось бы сделать одно приложение, а иконки подгружать динамически на основании настроек приложения.
Вспоминая практику VCL и WinAPI, подменить иконку Application оказалось задачей тривиальной:
NewAppIcon := TIcon.Create; NewAppIcon.LoadFromFile(AIconFile); SendMessage(ApplicationHWND, WM_SETICON, 1, NewAppIcon.Handle); А вот дальше начались проблемы. Окна уже прогрузили иконку по умолчанию и добраться до них у меня не получается.
Добраться через стиль не получается, потому что TForm не является наследником TStyledObject и не имеет StylesData. Через FindStyleResource тоже не получается добраться.

Может кто знает как?

По мотивам темы: [Windows] Как поменять иконку формы?

Как поменять иконку у формы со стилизованной рамкой под Windows?

Последние посетители 0 пользователей онлайн

Ни одного зарегистрированного пользователя не просматривает данную страницу

Delphi

Как-то видел скрин, где автор мучал wine. в коментах, автор указал, что у него удалось запустить Delphi и Builder без особых проблем, и что самое главное — все нормально работает!

Илон Маск рекомендует:  Пример определения и ограничения количества введённых символов в textarea

Я решил повторить подвиг.
Т.к. мне приходится писать много программ на Delphi в универ, я пользовался vmware. но теперь все намного проще :))

Немного поигрался, все работает очень хорошо. Из недостатков только то, что у меня почему-то не сохраняет положение закладок.. :(

Система (основное):
Gentoo 2006.1 (amd64)
Kde 3.5.2

Железо (основное):
amd x2 4200+
RAM 2x1024gb Corsar

Re: Delphi

>Система (основное): Gentoo 2006.1 (amd64) Kde 3.5.2

>Железо (основное): amd x2 4200+ RAM 2x1024gb Corsar

«спасибо, подрочил!» (с)

Re: Delphi

Не очень понимаю в Дельфях, но с пробелами и отступами у тебя там. такое ощущение, что тебе всё равно как писать, хоть в одну строчку, только требования среды останавливают полёт фантазии.

В Дженту, шрифты могли бы быть и получше.

Re: Delphi

Re: Delphi

для приличия хотя-бы версию wine напмсал-бы . атак всё лучше чем оффтопик

Re: Delphi

кросавчег просто :) я венду юзаю для быдлоделфей :)

Re: Delphi

Ну , рассказывай как делал ? Конфиги ?

Re: Delphi

Поставь лучше Лазарус

Re: Delphi

ИМХО DELPHI отстой .

Re: Delphi

А вас в универе по пальцам не бьют за такие отступы?

Re: Delphi

Встроенный отладчик Delphi работает?

Re: Delphi

Самое интересное, что эти 17 строчек аналогичны одной строчке echo $S >> $FileName :-)


Скрин нормальный, а автору учить английский и дельфю =)

Re: Delphi

Попробуй Visual студию запустить, расскажи как оно будет.

Комп канечно. жужжит наверное? А зимой греет?))

Re: Delphi

>Не очень понимаю в Дельфях, но с пробелами и отступами у тебя там

В делфи с отступами ой как погано. Мало того, что оно заменяет табы на пробелы, так еще и нельзя выделить кусок текста и отодвинуть его преред/назад. За такой текстовый редактор надо борландцев бить емаксом по рукам.

Re: Delphi

>так еще и нельзя выделить кусок текста и отодвинуть его преред/назад можно Ctl+Shift+K — влево, в право не помню

Re: Delphi

blaster999, сначала бы освоил ту же делфю. а потом критиковал то, чего ты не знаешь. у нее весьма прикольный редактор.. и двигать там можно как угодно.

Re: Delphi

ИМХО, ты — долбоеб. Хоть ты этому тоже рад.

Re: Delphi

>для приличия хотя-бы версию wine напмсал-бы . атак всё лучше чем оффтопик

Это CrossOver 5.0.1. :)

>кросавчег просто :) я венду юзаю для быдлоделфей :)

ну, каждый раз грузить винду для работы не интересно. Хватит с меня того, что vmware постоянно запускал.

>Ну , рассказывай как делал ? Конфиги ?

все гениальное просто: $ wine install.exe. А вообще, все стало нормально с помощью мастера установки CrossOver.

>Поставь лучше Лазарус

он под amd64 не работатет. вернее, даже не собирается :(

>ИМХО DELPHI отстой .

возможно, но мне выбирать не приходится.

>А вас в универе по пальцам не бьют за такие отступы?

а преподу пофиг, какой код. ему гравное — рабочая программа и алгоритм.

>Встроенный отладчик Delphi работает?

>Попробуй Visual студию запустить, расскажи как оно будет. >Комп канечно. жужжит наверное? А зимой греет?))

Я уже подумывал о VS. надо же как-то проги писать под кпк. И комп не жужжит и не греет! :) Когда хороший корпус (Termaltake v7000) и нормальные кулера, то все чудесно! Самое громкое в моей машине — винты (2x WD 250gb SATA).

Re: Delphi

Чувак, ну хватит уже железяку свою пиарить!

Задрало красноглазое пионерие, орущее на каждом углу о том, какое крутое железо ему купила мама.

Re: Delphi

>ИМХО DELPHI отстой .

Отстойность этой поделки настолько очевидна, что здесь не обсуждается, как и vb.

Re: Delphi

>>так еще и нельзя выделить кусок текста и отодвинуть его преред/назад

Re: Delphi

>RAM 2x1024gb Corsar

это же 2TB. С каких пор PC стал столько памяти поддерживать?

Я так понял, что при попытки хвастануться железом, автар перегнул слегонца.

P.S. Делфи нравился только за то, что можно было маленькие програмки «на один раз запустить» быстро написать, а так тормоз ужастный и ресурсов требует. Хотя с 2TB наверно летает :-)

Re: Delphi

>это же 2TB. С каких пор PC стал столько памяти поддерживать? >Я так понял, что при попытки хвастануться железом, автар перегнул слегонца.

да нет, просто запарился. :) ясно, что имелись в виду mb.

>P.S. Делфи нравился только за то, что можно было маленькие програмки «на один раз запустить» быстро написать, а так тормоз ужастный и ресурсов требует. Хотя с 2TB наверно летает :-)

да, по поводу программ на один раз — удобно. :)

Re: Delphi

>Чувак, ну хватит уже железяку свою пиарить! >Задрало красноглазое пионерие, орущее на каждом углу о том, какое крутое железо ему купила мама.

ок, небуду. я не специально. и это железо куплено на _лично заработанные_ деньги еще пол года назад.


Re: Delphi

Re: Delphi

отступы и «beckup» рулез :) весело :)

Re: Delphi

>отступы и «beckup» рулез :) весело :)

ну а может мне захотелось пошутить. beeeeee :) ясно, что я учил англ и правильно bAckUp :)))

P.S. а вообще, на самом деле, эту папку я просто перенес с диска друга, и тоже долго смеялся :)

Re: Delphi

>Я решил повторить подвиг. Т.к. мне приходится писать много программ на Delphi в универ

в топку такие универы!

Re: Delphi

>ну а может мне захотелось пошутить. beeeeee :) ясно, что я учил англ и правильно bAckUp :)))

>P.S. а вообще, на самом деле, эту папку я просто перенес с диска друга, и тоже долго смеялся :)

«Не отмазывайся — не военкомат»

Re: Delphi

>>Я решил повторить подвиг. Т.к. мне приходится писать много программ на Delphi в универ

>в топку такие универы!

а у нас на жабе быдлокодерствовать надо, но не обязательно ;) вот мой корефан на 12-ом семестре, но ещё ни одной строчки не напрограммировал. фак-тет информатики ;)))))

а я вот никак не найду тему для курсовой, где надо не на java/c/c++ писать :(

Re: Delphi

Жалеззе крутое, ничего не скажешь.

Для Linux есть Kylix и Lazarus (lazarus.freepascal.org)

Как Delphi-ист начиная с Delphi 1.0

могу добавить — за такю программу зачёт (не зачот) не получишь. Садись — ДВА и читай учебник.

Где обработка исключений при открытии файла и т.п.?

Re: Delphi

>»Не отмазывайся — не военкомат»

так точно, товарищь старшина! Готов признать свою вину и понести суровое наказание! :)))

Re: Delphi

>Где обработка исключений при открытии файла и т.п.?

хм. При открытии, если файл отсутствует, то он будет создан. При закрытии, обрабатывать не надо.

Да, можно было ввести try, и там проверять на доступность файл и т.д. Создать не процедуру, а функцию, которая будет возвращать true или false.

>Для Linux есть Kylix и Lazarus (lazarus.freepascal.org)

ну, kylix — мне не понравился. вот как раз он глючный и тормазной.Возможно я отстал от жизни, или чего-то не понимаю. Lazarus — еще недавно он был в стадии разработки под платформу amd64. и мои попытки его поставить закончились неудачно. Вот только сейчас проверил и увидел, что он доступен для мое архитектуры. :) Будем попробывать. А как у Лазаруса с поддержкой «закрытых» компонетов?

Re: Delphi

1. параметр S без const
2. отсутствие try..finally между созданием потока и вызовом Destroy
3. вызов Destroy вместо Free
4. отсутствие проверки S на пустую строку
садись, два.

Re: Delphi

>Железо (основное): amd x2 4200+ RAM 2x1024gb Corsar

Я вижу в Top500 метишшь, а на нормальный монитор что мама уже не дала денег?

Re: Delphi

> Я вижу в Top500 метишшь, а на нормальный монитор что мама уже не дала денег?

да я бы просто не потянул еще и новый монитор по финансам :( Довольствуюсь SM 757dfx

Delphi, скриншот определённой части экрана

Как снять скриншот определённой части экрана, и подгрузить его в Image2 ?

var
Sdc:HDc;
Can:Tcanvas;
begin
sdc:=GetDc(0);
Can:=Tcanvas.Create();
Can.Handle:=sdc;
w >Height:=Screen.Height;
image1.Canvas.CopyRect(rect(0, 0, image1.width, Image1.Height), canvas, Rect(0, 0, Screen.Width, Screen.Height));
ReleaseDc(0, sdc);
can.Free;
image1.Picture.Bitmap.SaveToFile(‘zlo.bmp’);
end;

Но он скриншотит весь экран, а мне нужна правая нижняя часть (трей) например 100х100px,
И в этом коде ещё сохраняется в файл, скажите ещё как подгрузить в Image2 и какие компоненты дописать в Uses для этого.

var
q, w: TRect;
left_, top_, right_, bottom_: Integer;
bit: TBitmap;
begin

left_ := StrToInt(Edit1.Text);
top_ := StrToInt(Edit2.Text);
right_ := StrToInt(Edit3.Text);
bottom_ := StrToInt(Edit4.Text);

sdc:=GetDc(0);
Can:=Tcanvas.Create();
Can.Handle:=sdc;


bit := TBitmap.Create;
bit.W > bit.Height := bottom_ — top_;

q := Rect(left_, top_, right_, bottom_);
w := Rect(0, 0, right_ — left_, bottom_ — top_);

Как сделать снимок экрана активного окна в Delphi?

Для полных скриншотов я использую этот код:

Как я могу преобразовать это, чтобы сделать снимок экрана только активного окна.

  • Прежде всего, вы должны получить нужное окно. Как уже отмечалось, sharptooth следует использовать GetForegroundWindow вместо GetDesktopWindow . Вы сделали это прямо в своей улучшенной версии.
  • Но тогда вы должны изменить размер растрового изображения на фактический размер DC/Window. Вы еще этого не сделали.
  • И затем убедитесь, что вы не захватили какое-то полноэкранное окно!

Когда я выполнил ваш код, моя IDE Delphi была захвачена и, по умолчанию, на полноэкранном режиме, она создала иллюзию полноэкранного снимка экрана. (Даже если ваш код в основном правильный)

Учитывая вышеописанные шаги, я смог создать скриншот с одним окном с вашим кодом.

Просто подсказка: вы можете GetDC вместо GetWindowDC , если вас интересует только область клиента. (Без границ окна)

РЕДАКТИРОВАТЬ: Вот что я сделал с вашим кодом:

Вы не должны использовать этот код! Посмотрите на улучшенную версию ниже.

РЕДАКТИРОВАТЬ 2: В соответствии с просьбой я добавляю лучшую версию кода, но я сохраняю старый в качестве ссылки. Вы должны серьезно подумать об использовании этого вместо исходного кода. В случае ошибок он будет намного лучше. (Ресурсы очищены, ваша форма будет видна снова. )

Delphi 6 скриншоты

у меня такой вопрос:

пишу программу запись изображения с экрана монитора, и не могу разобраться как добавить в программу выделение определенной области экрана мышкой, что бы запись производилась конкретно из этой выделенной области?

сам код записи и сохранения видео у меня уже есть, и с этим я разобрался, просто в моем коде я изначально указывал «height» и «width» в диапозоне которых и производилась запись, мне нужно добавить возможность выделения области экрана, что бы параметры высоты и ширины выделенной области копировались в программу, вот как то так.

вобщем как я понял нужно во первых нарисовать поверх всех окон (при нажатии на Mouse1) рамку, что бы пользователь видел какую конкретно область он выделил. далее нужно плясать по высоте и ширине от края экрана, для того что бы контуры рамки можно было увеличивать либо уменьшать — как при обычном выделении, но как это все выглядит в коде я не могу никак сообразить, подскажите кто в курсе как это должно быть или какие хоть функции использовать?

GReIIIHuK Дата: Вторник, 06.03.2012, 14:04 | Сообщение # 2
Если не секрет, каким способом ты пользуешься для записи видео?
Skype:»greiiihuk.»

Да, я преступник. Мое преступление — любопытство.
Быть может умру я, умрут многие, но идея останется жить навсегда.
Я работаю не только за спасибо.(+) ©

xXxSh@dowxXx Дата: Вторник, 06.03.2012, 14:32 | Сообщение # 3
я перепробовал несколько способов, есть также множество компонентов для этого, но больше всего мне понравились компоненты с этого сайта www.mitov.com у них очень даже неплохие и качественные компоненты для разработки множества разнообразных продуктов, тем более их компоненты поддерживают очень даже неплохой показатель FPS в работе, их я и использовал в своей программе.

xXxSh@dowxXx Дата: Вторник, 06.03.2012, 15:16 | Сообщение # 4
если я не ошибаюсь то вроде как нудно использовать функцию «DrawFocusRect» ?

у кого нибудь есть исходник или кто может хотя бы примерно код представить?

ребят помогите пожалуйста, это в принципе последнее чего так не хватает в программе.

нашел вот такие куски кода:

и рисование линий на DC:

но их же нада как то раскидать по MouseDown/MouseMove/MouseUp.

я примерно понимаю как все должно работать, но блин в коде не могу это описать

xXxSh@dowxXx Дата: Среда, 07.03.2012, 23:31 | Сообщение # 5
нашел вот такой вот код:

«Собственно программа работает следующим образом — с первой формы нажатием кнопки вызывается вторая. Вторая форма Alphablend=100, borderstyle:= none, align:= allclient. По нажатию кнопки мыша начинается рисование Canvas.Rectangle, по отпусканию кнопки — рисование прекращается, область прямоугольника сохраняется в файл»

200?’200px’:»+(this.scrollHeight+5)+’px’);»>
procedure TForm2.FormMouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
pos1 := Point(X, Y);
risuem := true;
Form2.AlphaBlendValue := 80;
end;

procedure TForm2.FormMouseUp(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
var
ScreenDC:HDC;
Canvas:TCanvas;
myjpg: TJPEGImage;
Image: TImage;
begin
pos2 := Point(X, Y);
risuem := false;
Form2.AlphaBlendValue := 1;

Image:=TImage.Create(nil);
myjpg:= TJPEGImage.Create;
ScreenDC := GetDC(0);
Canvas:=TCanvas.Create();
Canvas.Handle:=ScreenDC;
Image.W > Image.Height := pos2.y — pos1.y;
Image.Canvas.CopyRect(Rect(0,0,Image.Width,Image.Height), Canvas, Rect(pos1, pos2));
ReleaseDC(0,ScreenDC);
myjpg.Assign(Image.Picture.Bitmap);
myjpg.compressionquality:=100;
myjpg.compress;
myjpg.SaveToFile(‘prob.jpg’);
Image.Free;
Canvas.Free;
close;
end;

procedure TForm2.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if risuem = true then
begin
Form2.Canvas.Pen.Color := clNone;
Form2.Canvas.Brush.Color := clBtnFace;
Form2.Canvas.Rectangle(0,0,Form2.Width, Form2.Height);
Form2.Canvas.Pen.Color := clred;
Form2.Canvas.Brush.Color := clBlack;
Form2.Canvas.Rectangle(Classes.Rect(pos1, Point(x, y)));
pos3 := Point(X, Y);
end;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
Form2.Canvas.Pen.Color := clred;
Form2.Canvas.Brush.Color := clBlack;
end;

подскажите в чем ошибка?

я так понял что неизвестна переменные pos1;pos2;pos3;risuem
но как их объявить?

то что выдает компилятор я выложил в скрине.

и выложу еще исходник на всякий случай, ни как не могу сообразить, вроде такая фигня, ночью вобще голова не варит совсем

Как я делаю скриншоты или как сделать снимок с экрана вашего монитора. Инструкция

Сегодня я хочу поделиться некоторым не так давно приобретённым опытом по умению делать скриншоты. Что же такое скриншот, спросите Вы и как его сделать и вообще зачем он нужен. Думаю все когда-либо сталкивались с такой проблемой как сделать снимок с экрана монитора, чтобы написать подробную инструкцию (например вот такую Как сделать заказ? ). Поэтому это натолкнуло меня написать этот пост. Надеюсь некоторым эта информация окажется полезной и кому-то сможет облегчить написание инструкций и отзывов.

И так, что же такое скриншот?

Скриншот (screenshot) — снимок экрана, картинка, которая отображает то, что показывает ваш монитор.


Снятие скриншотов — важная часть работы. Скриншот экрана очень полезен для службы технической поддержки, т.к. он отображает то, что видит пользователь: сообщения об ошибках, используемые программы и другую информацию.

Порядок действий для создания скрина:

1. Нажмите клавишу Print screen или PrtScSysRq (верхний правый угол клавиатуры) — и в память Вашего компьютера будет занесен скриншот — картинка текущего состояния экрана. Эту кнопку я выделила красным кружком и выглядит на клавиатуре вот так:

Вот изображение поближе:

Изображение на ноутбуке:

Изображение ближе на нОуте:

Просто при нажатии Print Screen будет «сфотографирован» экран полностью.

2. При нажатии комбинации Alt + Print Screen будет сделан скриншот активного в данный момент окна.

При нажатии клавиши Print Screen (или комбинации Print Screen + Alt) ничего не происходит. Дело в том, что рисунок временно помещается в буфер обмена, и чтобы «достать» его оттуда, следует воспользоваться графическим редактором либо вставить картинку в нужное приложение.
Простенький (но достаточный для наших действий) графический редактор также встроен в Windows. Он называется Paint, и запустить его можно, пройдя по ссылке Пуск — Все программы — Стандартные — Paint.

3. Откройте Пэйнт — Paint

4. В верхнем правом углу в программе Paint будет окошечко «Вставить» . Кликаем на него левой кнопкой мыши. И выходит из буфера обмена наше сохранённое изображение с монитора.

Получаем изображение с монитора:

По желанию изображение можно выделить и обрезать лишнее. Кликнуть на кнопку «Выделить» с образованием выделенной области пунктирной линией и далее кликнуть«Обрезать». Ненужная область просто отсечётся. Также скрины можно обработать в редакторе (сделать подписи, что-то выделить и т.д.) и сохранить в отдельный файл (Файл — Сохранить как… ).

… получаем обрезанный скрин

5. Далее, чтобы сохранить изображение, нужно выбрать из выпадающего списка» Сохранить как. «

6. Обзовите свой скриншот, выберите подходящий формат сохранения скрина (обычно я сохраняю в JPEG ) и кликните на кнопку «Сохранить» в ту папку где Вам будет удобнее потом найти сохранённые скриншоты.

Вот и всё. Набор этих несложных действий может серьёзно помочь в решении некоторых проблем, и пренебрегать этой возможностью не стоит. Теперь файл можно отправить по электронной почте прикрепив его к письму или написать пост, инструкцию.

пы. сы.: изображения на скринах хоть и разные, но надеюсь что суть куда и чего ясна :-))))) Всем спасибо что дочитали.

Delphi 6 скриншоты

Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 5
Всего: 260

Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 6
Всего: 158

dumb
Дата 14.11.2006, 03:14 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Модератор
Сообщений: 18483
Регистрация: 14.5.2003
Где: Корусант

Репутация: 3
Всего: 329

Akella
Дата 14.11.2006, 09:32 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 5
Всего: 260

skyboy
Дата 14.11.2006, 10:22 (ссылка) | (нет голосов) Загрузка .
Цитата(Akella @ 14.11.2006, 08:32 )
2. глубина цвета.
Цитата(Akella @ 14.11.2006, 08:32 )
количество снимков в минуту или секунду

Профиль
Группа: Участник
Сообщений: 203
Регистрация: 18.7.2006
Где: Калининград

Репутация: нет
Всего: нет

artem1987
Дата 14.11.2006, 16:43 (ссылка) | (нет голосов) Загрузка .
Цитата
3. Съемка по событию(перехват сообщения на перерисовку и подобное).
Плюс: можем бросать при изменении широковещательный пакет, все остальное время не передавать ничего — нагрузка на сеть минимальна, процессор загружен только когда надо.
Минус: сложность реализации

Профиль
Группа: Админ
Сообщений: 11740
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 23
Всего: 459

Alexeis
Дата 14.11.2006, 18:06 (ссылка) | (нет голосов) Загрузка .
Цитата(skyboy @ 14.11.2006, 10:22 )
некритично. сжимать буду JPEG — размеры вряд ли будут большие.

Добавлено @ 18:10
Еще бы в PNG жал . Это же пол секунды кадр! + бешаная загрузка проца клиента.
Я бы вычитал два соседних кадра и жал все это в RLE, так хоть есть шанс, что машина успеет сжать. Да и разностная картинка будет иметь много черных полей, которые отлично и без нагрузки жмет это самое RLE.

Это сообщение отредактировал(а) alexeis1 — 14.11.2006, 18:11

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать

Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 5
Всего: 133

Poseidon
Дата 15.11.2006, 00:03 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 285
Регистрация: 29.1.2006

Репутация: -1
Всего: 3


W1zArD
Дата 15.11.2006, 22:33 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 5
Всего: 260

skyboy
Дата 15.11.2006, 23:31 (ссылка) | (нет голосов) Загрузка .
Цитата(Poseidon @ 14.11.2006, 23:03 )
Т.е. програма на «сервере» анализиует предыдущий «снимок» и сравнивает с нынешним. Разнице отправляет клиенту.
Цитата(alexeis1 @ 14.11.2006, 17:06 )
Я бы вычитал два соседних кадра и жал все это в RLE, так хоть есть шанс, что машина успеет сжать. Да и разностная картинка будет иметь много черных полей, которые отлично и без нагрузки жмет это самое RLE.

Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 5
Всего: 133

Poseidon
Дата 16.11.2006, 00:04 (ссылка) | (нет голосов) Загрузка .
Цитата(skyboy @ 15.11.2006, 23:31 )
Ты об этом, Poseidon:

Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет

Хотелось всё-таки поднять этот вопрос.

Скажите, а в какой формат Вы бы порекомендовали сохранять кидаемый скриншот?
Чем потом жать или нет?
Видел тут RLE предлагали, это ли оптимальный вариант??
BMP, потом по нему RLE.

DelphiFun
Дата 1.1.2007, 21:56 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 5
Всего: 260

skyboy
Дата 1.1.2007, 22:18 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Админ
Сообщений: 11740
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 23
Всего: 459

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать

Alexeis
Дата 1.1.2007, 23:42 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет

DelphiFun
Дата 2.1.2007, 00:53 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 5
Всего: 260

skyboy
Дата 2.1.2007, 01:12 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Админ
Сообщений: 11740
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 23
Всего: 459

Alexeis
Дата 2.1.2007, 01:22 (ссылка) | (нет голосов) Загрузка .
Цитата(DelphiFun @ 2.1.2007, 00:53 )
Мы отправляем ведь только изменённые куски..

Хм. А как их найти эти самые измененные куски? Вычли из предыдущего кадра новый, вот и получили черные поля. Черное поле это цвет со значением «0» т.е. неизменные поля. РЛЕ такие области кодирует
1) Признак повторения
2) Цвет повторения
3) Число пикселей повторения.

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

Как видно алгоритм основан, на простом сравнении и потому черезвычайно быстрый. Хотя для скриншотов наилучшее сжатие обычно дает png, но время сжатия одного кадра столь велико, что думаю даже Dual Core 6700 не потянет больше 5 кадров / с.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать

Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет

DelphiFun
Дата 2.1.2007, 03:42 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет

DelphiFun
Дата 2.1.2007, 17:36 (ссылка) | (нет голосов) Загрузка .
Код
var
BMP1, BMP2, BMP3 : TBitmap;
RowBMP1, RowBMP2, RowBMP3 : pByteArray;
j, i : integer;

BMP1 := TBitmap.Create;
BMP1.W > BMP1.Height := Screen.Height;
BMP1.PixelFormat := pf24bit;
BMP.LoadFromFile( ‘ScreenShot1.bmp’ );

BMP2 := TBitmap.Create;
BMP2.W > BMP2.Height := BMP1.Height;
BMP2.PixelFormat := pf24bit;
BMP2.LoadFromFile( ‘ScreenShot2.bmp’ );

BMP3 := TBitmap.Create;
BMP3.W > BMP3.Height := BMP1.Height;
BMP3.PixelFormat := pf24bit;

for j := 0 to BMP1.Height — 1 do begin

RowBMP1 := pByteArray ( BMP1.ScanLine[j] );
RowBMP2 := pByteArray ( BMP2.ScanLine[j] );
RowBMP3 := pByteArray ( BMP3.ScanLine[j] );


for i := 0 to BMP1.Width * 3 — 1 do
if ( RowBMP2[i] = RowBMP1[i] ) then RowBMP3[i] := 0
else RowBMP3[i] := RowBMP2[i];
// RowBMP3[i] := RowBMP1[i] xor RowBMP2[i];

ReleaseDC ( 0, DC );
BMP1.Free; BMP2.Free; BMP3.Free;

В чём тут может быть проблема?

Профиль
Группа: Админ
Сообщений: 11740
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 23
Всего: 459

Alexeis
Дата 2.1.2007, 18:06 (ссылка) | (нет голосов) Загрузка .
Цитата(DelphiFun @ 2.1.2007, 17:36 )
Хм, а что-то xor’ом не получается выделить разницу..

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать

Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет

Так нет, ни xor, ни минус не срабатывают!
А у тебя разве сработало?

А xor я попробовал по совету skyboy несколькими постами ранее здесь.

DelphiFun
Дата 3.1.2007, 00:22 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Админ
Сообщений: 11740
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 23
Всего: 459

Alexeis
Дата 3.1.2007, 00:53 (ссылка) | (нет голосов) Загрузка .
Код
procedure TForm1.FormCreate(Sender: TObject);
var
BMP1, BMP2, BMP3 : TBitmap;
RowBMP1, RowBMP2, RowBMP3 : pByteArray;
j, i : integer;
begin
BMP1 := TBitmap.Create;
BMP1.PixelFormat := pf24bit;
//***********************************************
//вот тут было BMP.LoadFromFile( ‘ScreenShot1.bmp’ );
BMP1.LoadFromFile( ‘ScreenShot1.bmp’ );
//***********************************************
BMP2 := TBitmap.Create;
BMP2.PixelFormat := pf24bit;
BMP2.LoadFromFile( ‘ScreenShot2.bmp’ );

BMP3 := TBitmap.Create;
BMP3.W > BMP3.Height := BMP1.Height;
BMP3.PixelFormat := pf24bit;

for j := 0 to BMP1.Height — 1
do
begin
RowBMP1 := pByteArray ( BMP1.ScanLine[j] );
RowBMP2 := pByteArray ( BMP2.ScanLine[j] );
RowBMP3 := pByteArray ( BMP3.ScanLine[j] );
for i := 0 to BMP1.Width * 3 — 1
do
if ( RowBMP2[i] = RowBMP1[i] )
then
RowBMP3[i] := 0
else
RowBMP3[i] := RowBMP2[i];
// RowBMP3[i] := RowBMP1[i] xor RowBMP2[i];
end;

BMP3.SaveToFile ( ‘Diffrence.bmp’ );
BMP1.Free;
BMP2.Free;
BMP3.Free;
end;

В прикрепленном архиве 3 файла 1) исходный, 2) измененный 3) разница

Присоединённый файл ( Кол-во скачиваний: 7 )
24.7z 108,27 Kb

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать

Профиль
Группа: Админ
Сообщений: 11740
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 23
Всего: 459

Alexeis
Дата 3.1.2007, 01:16 (ссылка) | (нет голосов) Загрузка .
Код
BOOL BitBlt(

HDC hdcDest, // handle to destination device context
int nXDest, // x-coordinate of destination rectangle’s upper-left corner
int nYDest, // y-coordinate of destination rectangle’s upper-left corner
int nWidth, // width of destination rectangle
int nHeight, // height of destination rectangle
HDC hdcSrc, // handle to source device context
int nXSrc, // x-coordinate of source rectangle’s upper-left corner
int nYSrc, // y-coordinate of source rectangle’s upper-left corner
DWORD dwRop // raster operation code
);

Вот последний параметр как раз и определяет растровую операцию

Цитата
BLACKNESS Fills the destination rectangle using the color associated with index 0 in the physical palette. (This color is black for the default physical palette.)
DSTINVERT Inverts the destination rectangle.
MERGECOPY Merges the colors of the source rectangle with the specified pattern by using the Boolean AND operator.
MERGEPAINT Merges the colors of the inverted source rectangle with the colors of the destination rectangle by using the Boolean OR operator.
NOTSRCCOPY Copies the inverted source rectangle to the destination.
NOTSRCERASE Combines the colors of the source and destination rectangles by using the Boolean OR operator and then inverts the resultant color.
PATCOPY Copies the specified pattern into the destination bitmap.
PATINVERT Combines the colors of the specified pattern with the colors of the destination rectangle by using the Boolean XOR operator.
PATPAINT Combines the colors of the pattern with the colors of the inverted source rectangle by using the Boolean OR operator. The result of this operation is combined with the colors of the destination rectangle by using the Boolean OR operator.
SRCAND Combines the colors of the source and destination rectangles by using the Boolean AND operator.
SRCCOPY Copies the source rectangle directly to the destination rectangle.
SRCERASE Combines the inverted colors of the destination rectangle with the colors of the source rectangle by using the Boolean AND operator.
SRCINVERT Combines the colors of the source and destination rectangles by using the Boolean XOR operator.
SRCPAINT Combines the colors of the source and destination rectangles by using the Boolean OR operator.
WHITENESS Fills the destination rectangle using the color associated with index 1 in the physical palette. (This color is white for the default physical palette.)

Полный спектр всех операций, которые только могут понадобиться

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать

Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет

Во чёрт, ошибся в еденичке!!
Спасибо за помощь!!

Хм, а почему с этими файлами аналогично не работает?
http://ifolder.ru/774066

Файлы 24битовые, что в них не так.

DelphiFun
Дата 3.1.2007, 03:38 (ссылка) | (нет голосов) Загрузка .
Код
RowBMP3[i] := RowBMP1[i] xor RowBMP2[i];

Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет

DelphiFun
Дата 3.1.2007, 16:39 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет

DelphiFun
Дата 4.1.2007, 02:04 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Админ
Сообщений: 11740
Регистрация: 12.10.2005
Где: Зеленоград


Репутация: 23
Всего: 459

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать

Alexeis
Дата 4.1.2007, 18:38 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет

Вот эти файлы и файл-разницы..

Присоединённый файл ( Кол-во скачиваний: 4 )
2.zip 15,59 Kb

DelphiFun
Дата 4.1.2007, 18:49 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Админ
Сообщений: 11740
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 23
Всего: 459

Alexeis
Дата 4.1.2007, 21:36 (ссылка) | (нет голосов) Загрузка .
Цитата(DelphiFun @ 4.1.2007, 18:49 )
Вот эти файлы и файл-разницы..

Там все нормально, только результат будет зависеть от порядка следования картинок. Если использовать XOR то в этом случае все однозначно. Результирующая картинка является правильной. Кстати я настоятельно советую воспользоваться bitblt, поскольку она использует аппаратное ускорение видеокарты и скорость такой операции будет гораздо больше чем при использовании процессора.

Добавлено @ 21:51
Вот пожалуйста насколько проще и главное быстрее, можно сделать тотже самый XOR

Код
procedure TForm1.FormCreate(Sender: TObject);
var
BMP1, BMP2 : TBitmap;

begin
BMP1 := TBitmap.Create;
BMP2 := TBitmap.Create;
BMP1.LoadFromFile( ‘ScreenShot1.bmp’ );
BMP2.LoadFromFile( ‘ScreenShot2.bmp’ );
BitBlt(BMP2.Canvas.Handle, 0, 0, BMP2.Width, BMP2.Height,
BMP1.Canvas.Handle, 0, 0, SRCINVERT);
BMP2.SaveToFile ( ‘Diffrence.bmp’ );
BMP1.Free;
BMP2.Free;
end;

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать

Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет

Спасибо большое за ответ!

А почему же получается такой результат??
Но XOR ведь тоже не отделяет эту новую линию от остальных..(то бишь разницу).. или у тебя отделяет?
XOR у меня выделяет эту линию красным цветом..

DelphiFun
Дата 4.1.2007, 22:02 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Админ
Сообщений: 11740
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 23
Всего: 459

Alexeis
Дата 4.1.2007, 23:25 (ссылка) | (нет голосов) Загрузка .
Цитата(DelphiFun @ 4.1.2007, 22:02 )
XOR у меня выделяет эту линию красным цветом..

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать

Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет

DelphiFun
Дата 5.1.2007, 01:07 (ссылка) | (нет голосов) Загрузка .
Код
if ( RowBMP2[i] = RowBMP1[i] )
then
RowBMP3[i] := 0
else
RowBMP3[i] := RowBMP2[i];

Профиль
Группа: Админ
Сообщений: 11740
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 23
Всего: 459

Alexeis
Дата 5.1.2007, 01:33 (ссылка) | (нет голосов) Загрузка .
Цитата(DelphiFun @ 5.1.2007, 01:07 )
также ведь не отделяет разницу. А вот он-то по идее должен.. нет разве?

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать

Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет

DelphiFun
Дата 5.1.2007, 01:59 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет

DelphiFun
Дата 5.1.2007, 04:15 (ссылка) | (нет голосов) Загрузка .

Профиль
Группа: Админ
Сообщений: 11740
Регистрация: 12.10.2005
Где: Зеленоград

Репутация: 23
Всего: 459

Alexeis
Дата 5.1.2007, 12:23 (ссылка) | (нет голосов) Загрузка .
Цитата(DelphiFun @ 5.1.2007, 01:59 )
А как же произвести накладку на предыдущий скриншот так, чтобы оно наложилось именно тем «цветом» который был изначально. Ещё раз XOR’ом?
Цитата(DelphiFun @ 5.1.2007, 01:59 )
А в случае с XOR’ом передавать именно эту картинку?


Не совсем ее, точнее ее сжатый аналог.

Цитата(DelphiFun @ 5.1.2007, 04:15 )
Кстати, а что означает «превышения уровня»? Какого уровня, о чем речь идёт?

Составляющая цвета имеет 255 градаций, если скажем вычитать цвета, то например 212 — 220 = — 8, но такое число реально запишется как 247, потому что вышли из диапазона 0..255.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать

Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет

DelphiFun
Дата 5.1.2007, 14:52 (ссылка) | (нет голосов) Загрузка .
Цитата
Не совсем ее, точнее ее сжатый аналог.

А, ну с этим понятно. С RLE я думаю проблем у меня не возникнет.

А обратно это XOR чего с чем? Одно это бит картинки, а второй?

Мне кажется такое впринципе не прокатит, потому как посмотри какая после XOR’а получается интересная разница. линия ( бирюзового цвета ) ведь ПОВЕРХ, а он в разнице отображает ещё и то, что было под ней.
блин а как такое вообще возможно?

Таким макаром любую картинку сканировать можно на то, что было под верхней линией

На крайняк прийдётся сравнивать именно цвета объединяя несколько битов в один..

Профиль
Группа: Модератор
Сообщений: 9820
Регистрация: 18.5.2006
Где: Днепропетровск

Репутация: 5
Всего: 260

skyboy
Дата 5.1.2007, 15:01 (ссылка) | (нет голосов) Загрузка .
Цитата(DelphiFun @ 5.1.2007, 13:52 )
А обратно это XOR чего с чем?

Профиль
Группа: Участник
Сообщений: 42
Регистрация: 10.11.2006

Репутация: нет
Всего: нет

skyboy, Alexeis, Спасибо большое за помощь в решении этой проблемы!!

DelphiFun
Дата 5.1.2007, 16:52 (ссылка) | (нет голосов) Загрузка .
Google
Дата 12.11.2020, 14:52 (ссылка)

ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Несоблюдение правил может повлечь за собой самые строгие меры от закрытия/удаления темы до бана пользователя!

  • Название темы должно отражать её суть! (Не следует добавлять туда слова «помогите», «срочно» и т.п.)
  • При создании темы, первым делом в квадратных скобках укажите область, из которой исходит вопрос (язык, дисциплина, диплом). Пример: [C++].
  • В названии темы не нужно указывать происхождение задачи (например «школьная задача», «задача из учебника» и т.п.), не нужно указывать ее сложность («простая задача», «легкий вопрос» и т.п.). Все это можно писать в тексте самой задачи.
  • Если Вы ошиблись при вводе названия темы, отправьте письмо любому из модераторов раздела (через личные сообщения или report).
  • Для подсветки кода пользуйтесь тегами [code][/code] (выделяйте код и нажимаете на кнопку «Код»). Не забывайте выбирать при этом соответствующий язык.
  • Помните: один топик — один вопрос!
  • В данном разделе запрещено поднимать темы , т.е. при отсутствии ответов на Ваш вопрос добавлять новые ответы к теме, тем самым поднимая тему на верх списка.
  • Если вы хотите, чтобы вашу проблему решили при помощи определенного алгоритма, то не забудьте описать его!
  • Если вопрос решён, то воспользуйтесь ссылкой «Пометить как решённый», которая находится под кнопками создания темы или специальным флажком при ответе.

Более подробно с правилами данного раздела Вы можете ознакомится в этой теме.

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman

Delphi

Наши проекты

Как же программно сделать снимок экрана и сохранить его на диск? Очень просто:

sportmagaz.com.ua интернет магазины детской спортивной одежды,еще,Компьютерные кресла для детей. Компьютерные офисные кресла.

Copyright © 2008 — 2020 Программирование на Delphi для начинающих и не только.

Полнота авторских прав на все материалы, опубликованные на сервере DelphiDevelop.ru принадлежит их авторам.

Перепечатка материалов разрешается с указанием авторства и гиперссылки на первоисточник информации.

Как сделать скриншот с помощью FireMonkey (мультиплатформенность)

Я не нашел функцию для получения снимка экрана в FMX. Платформа (во всяком случае, больше нигде . ).

С VCL есть много ответов (stackoverflow, google, . ).

Но как получить снимок экрана с изображением (растровое изображение или что-то еще) для Windows и Mac OS X?

Обновление: ссылка от Tipiweb дает хорошее решение для OS X.

Что касается части Windows: я кодировал это, но мне не нравится использовать VCL и Stream для его достижения . Есть лучшее предложение, комментарии?

3 ответа

Я создаю небольшое приложение, чтобы сделать скриншот (Windows / Mac), и оно работает :-)!

Для совместимости с Windows и Mac я использую поток.

API Windows Capture -> Vcl.Graphics.TBitmap -> TStream.

После этого я загружаю свой TStream для Windows или Mac в FMX.Types.TBitmap (с загрузкой из потока)

Код модуля Windows:

Код устройства Mac:

В вашем модуле mainForm:

Если у вас есть другая идея, пожалуйста, поговорите со мной :-)

Вы можете использовать хорошее решение с этого сайта, чтобы сделать скриншот Mac OSX.

Сделайте то же самое с Windows API следующим образом:

После этого включите ваши различные юниты с:

Благодаря коду Tipiweb (в его ответе) на его основе был запущен проект github; с некоторыми улучшениями (возможность сделать скриншот только определенного окна или сделать полный скриншот).

Модуль называется xscreenshot.pas (один модуль для всех платформ).

Страница проекта github:

Утилиты, доступные в этом модуле:

Последние штрихи в MacOS требуют некоторой работы для создания снимка экрана определенного окна.

Еще раз, спасибо Типивебу и его ответу, чтобы начать этот проект.

Илон Маск рекомендует:  Что такое код cpdf_setlinecap
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL
Правила форума «Центр помощи»