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 без особых проблем, и что самое главное — все нормально работает!
Я решил повторить подвиг.
Т.к. мне приходится писать много программ на 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 в работе, их я и использовал в своей программе. | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
HDC hdcDest, // handle to destination device context Вот последний параметр как раз и определяет растровую операцию
Полный спектр всех операций, которые только могут понадобиться Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
DelphiFun |
|
|
Код |
RowBMP3[i] := RowBMP1[i] xor RowBMP2[i]; |
DelphiFun |
|
|
DelphiFun |
|
|
Alexeis |
|
|
DelphiFun |
|
|
Alexeis |
|
||
Цитата(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;
Обсуждение действий администрации форума производятся только в этом форуме
гениальность идеи состоит в том, что ее невозможно придумать
DelphiFun |
|
|
Alexeis |
|
|
Цитата(DelphiFun @ 4.1.2007, 22:02 ) |
XOR у меня выделяет эту линию красным цветом.. |
Обсуждение действий администрации форума производятся только в этом форуме
гениальность идеи состоит в том, что ее невозможно придумать
DelphiFun |
|
|
Код |
if ( RowBMP2[i] = RowBMP1[i] ) then RowBMP3[i] := 0 else RowBMP3[i] := RowBMP2[i]; |
Alexeis |
|
|
Цитата(DelphiFun @ 5.1.2007, 01:07 ) |
также ведь не отделяет разницу. А вот он-то по идее должен.. нет разве? |
Обсуждение действий администрации форума производятся только в этом форуме
гениальность идеи состоит в том, что ее невозможно придумать
DelphiFun |
|
|
DelphiFun |
|
|
Alexeis |
|
||||
Цитата(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.
Обсуждение действий администрации форума производятся только в этом форуме
гениальность идеи состоит в том, что ее невозможно придумать
DelphiFun |
|
|
Цитата |
Не совсем ее, точнее ее сжатый аналог. |
А, ну с этим понятно. С RLE я думаю проблем у меня не возникнет.
А обратно это XOR чего с чем? Одно это бит картинки, а второй?
Мне кажется такое впринципе не прокатит, потому как посмотри какая после XOR’а получается интересная разница. линия ( бирюзового цвета ) ведь ПОВЕРХ, а он в разнице отображает ещё и то, что было под ней.
блин а как такое вообще возможно?
Таким макаром любую картинку сканировать можно на то, что было под верхней линией
На крайняк прийдётся сравнивать именно цвета объединяя несколько битов в один..
skyboy |
|
|
Цитата(DelphiFun @ 5.1.2007, 13:52 ) |
А обратно это XOR чего с чем? |
DelphiFun |
|
|
|
||
Правила форума «Центр помощи» | |