Форум программистов, компьютерный форум, киберфорум
Наши страницы

Delphi: графика, звук, видео

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 21, средняя оценка - 4.90
amakl
0 / 0 / 0
Регистрация: 21.08.2010
Сообщений: 24
#1

Как сделать скриншот, получая данные непосредственно из видеопамяти. - Delphi

13.01.2011, 14:00. Просмотров 2729. Ответов 12
Метки нет (Все метки)

Я так предполагаю, нужно использовать asm вставки. Искал в сети исходники, но так и не нашел.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.01.2011, 14:00
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как сделать скриншот, получая данные непосредственно из видеопамяти. (Delphi):

Как сделать скриншот региона экрана - Delphi
Как сделать скриншот регоина экрана??? Я пыталься сделать так: procedure ScreenShot(Bild: TBitMap); var c: TCanvas; ...

Как сделать скриншот нужных мне координат в webbrowser? - Delphi
Здравствуйте формчани) Прошу помощи, так как уже 2 дня не могу понять как сделать скриншот нужной области. Вот код снимка ...

Как сделать скриншот игры минуя квадрат Малевича? - Delphi
Народ нужно делать скрины игры, стандартный Bitblt возвращает квадрат Малевича. Может кто то подкинет пример или толкнет в нужную сторону,...

Сделать скриншот свернутого приложения - Delphi
Фрапс умеет такое делать.. Как бы мне делфи такому научить??? В сети есть море кода - но они лишь скринять заголовок Например вот - ...

Сделать скриншот экрана / копировать экранную область видеопамяти - C++ WinAPI
Доброго времени суток. Для работы программы необходимо получить копию(скриншот) экрана, с запущенным directX приложением (собственно...

Мап видеопамяти или скриншот из r0 - Программирование драйверов
Вроде тема избита, но чтот не выходит. HLP. Через IOCTL - IOCTL_VIDEO_MAP_VIDEO_MEMORY (XP32) какая-то чушь получается, причем на...

12
Voland_
1472 / 982 / 93
Регистрация: 04.01.2010
Сообщений: 3,227
13.01.2011, 14:12 #2
amakl, встречный вопрос: а что вы хотите взять из видеопамяти? Экран захватить?
0
amakl
0 / 0 / 0
Регистрация: 21.08.2010
Сообщений: 24
13.01.2011, 14:17  [ТС] #3
Цитата Сообщение от Voland_ Посмотреть сообщение
amakl, встречный вопрос: а что вы хотите взять из видеопамяти? Экран захватить?
Нужно сделать копию экрана, и записать ее в bmp-файл.
0
Voland_
1472 / 982 / 93
Регистрация: 04.01.2010
Сообщений: 3,227
13.01.2011, 16:29 #4
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function CreateScreenshot: TBitmap;
var
 dw: HWND;
 dc: HDC;
begin
 Result := TBitmap.Create;
 Result.Width := Screen.Width;
 Result.Height := Screen.Height;
 dw := GetDesktopWindow;
 dc := GetDC(dw);
 BitBlt(Result.Canvas.Handle, 0, 0, Result.Width, Result.Height,
   dc, 0, 0, SRCCOPY);
 ReleaseDC(dw, dc);
 Result.SaveToFile('c:\111.bmp');
end;
0
amakl
0 / 0 / 0
Регистрация: 21.08.2010
Сообщений: 24
13.01.2011, 22:19  [ТС] #5
Мне надо обойтись без GetDC, читать непосредственно из видеопамяти.
0
Voland_
1472 / 982 / 93
Регистрация: 04.01.2010
Сообщений: 3,227
14.01.2011, 11:56 #6
http://www.programmersheaven.com/mb/...-to-video-ram/

So, hope this helps . Кратко о чем там: народ обсуждает как это может быть реализовано и почему этого нельзя сделать под Windows NT.
0
FreeLancer93
33 / 33 / 1
Регистрация: 18.01.2011
Сообщений: 62
18.01.2011, 15:34 #7
Если бы ты мог обойтись без GetDC(), то ты бы мог сделать прогу, делающую скрины весьма беспалевно от антивирусника.
Не думаю что именно в Delphi можно обойтись без GetDC. На Си, возможно, как нибудь хитроделанно это возможно сделать.
0
amakl
0 / 0 / 0
Регистрация: 21.08.2010
Сообщений: 24
19.01.2011, 03:00  [ТС] #8
В дельфи есть всторенный ассемблер, на нем, возможно, и надо делать. Видел в интернете код на ассемблере, который пишет непосредственно в видеопамять, а вот считывания из видеопамяти не нашел.
0
Voland_
1472 / 982 / 93
Регистрация: 04.01.2010
Сообщений: 3,227
19.01.2011, 11:15 #9
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function getport(p:word):byte; stdcall;
begin
  asm
    push edx
    push eax
    mov  dx,p
    in   al,dx
    mov  @result,al
    pop  eax
    pop  edx
  end;
end;
 
 
 
Procedure Setport(p:word;b:byte);Stdcall;
begin
  asm
    push edx
    push eax
    mov dx,p
    mov al,b
    out dx,al
    pop  eax
    pop  edx
  end;
end;
Попробуйте, может, это вам подойдет?

ЗЫ: пример разработан под Win95, однако из под WinNT он по идее должен работать, если установить драйвер DLportIO (можно найти в инете)...
hope this helps...
Видеоданные начинаются с порта A000, судя по описанию, соответственно, в/из этих портов нужно писать/читать.
0
amakl
0 / 0 / 0
Регистрация: 21.08.2010
Сообщений: 24
19.01.2011, 23:31  [ТС] #10
Спасибо, за помощь. Getport - это, видимо, функция открытия порта. Может подскажете, как ей пользоваться? Что за параметр p. Как с помощью этой функции прочитать весь экран?
P.S. Опыт работы с ассемблером отсутствует.
0
Voland_
1472 / 982 / 93
Регистрация: 04.01.2010
Сообщений: 3,227
20.01.2011, 00:31 #11
amakl, примерно так:

Delphi
1
2
3
4
5
6
7
8
var
  a : array of word;
  i : integer;
begin
  SetLength(a, 16); // Формируем массив из 16 значений по 16 бит
  for i:=0 to 15 do 
    a[i] := getport($A000+i*2)*$100 + getport($A000+i*2+1); // забираем 16битный цвет из памяти видеокарты
...
Сложно сказать, будет ли это работать, но попробовать стОит...
PS: не забудьте про DLportIO. Без него ничего работать не будет по WinXP и иже с ней.
0
amakl
0 / 0 / 0
Регистрация: 21.08.2010
Сообщений: 24
20.01.2011, 20:55  [ТС] #12
Voland_, попробывал ваш пример, к сожалению не получается. Вылезает исключение
"Privileged instruction". Видимо система запрещает программе напрямую общаться с портом.
Установка DLportIO не помогла - появляется такое же исключение.
0
Voland_
1472 / 982 / 93
Регистрация: 04.01.2010
Сообщений: 3,227
21.01.2011, 14:35 #13
amakl, ну тогда вам поможет только Win'95/98. DLportIO помогает в работе с устройствами, которые раньше использовались в пром.санциях и вставлялись в ISA/PCI. Работа с ними и осуществлялась через порты. Вот там-то он и работал. А тут Винда, наверное, рубит все возможное и невозможное. Либо просто неправильно выбран адрес порта. Например, попробуйте вообще почитать порты, замените $A000 на что-нить другое, $8000, 0 и др.

ЗЫ: писать в "любые" порты сильно не рекомендую, если это получится сделать, то вы сможете где-то чего лишнего поломать, причем, физически. Один знакомый таким образом доломал плохо работающий CD-привод в свое время. Иначе нельзя было доказать продавцам, что его надо менять по гарантии.
0
21.01.2011, 14:35
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.01.2011, 14:35
Привет! Вот еще темы с ответами:

Как передать данные из массива непосредственно в диаграмму, минуя сводную таблицу? - VBA
Эти строчки передают данные по Х и У из диапазонов В7:Н7, В8:Н8 и затем на их основе строится диаграмма: .SeriesCollection(1).XValues =...

Как сделать скриншот экрана? - C (СИ)
1. Программа через равные промежутки времени (2...5 сек) должна делать скриншот и сохранять его в любом формате, файл постоянно...

Как сделать скриншот экрана? - C# WPF
Как сделать скриншот экрана (допустим, 200 на 300px, по координатам x: 150, y: 20) и поместить его в image?

Как сделать скриншот видео? - PHP
Здравствуйте, как сделать скриншот видео с помощью php, чтобы было так же как сжатие картинки только видео? Вот это сжатие картинки: ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru