Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

фото с вебкамеры. [D7, XP]


Страницы:   1 2

vegarulez ©   (2011-02-02 18:27:00) 

Привет всем!
комрады, подскажите такой вопрос, как можно с вебкамеры сделать снимок просто в jpg файл к примеру. Код для захвата видео - нашел - он работает - теперь вопрос как мне по событию - допустим по нажатию на кнопку делать снимок с вебкамры.


unit Unit1;

interface

uses
 Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, StdCtrls,ShellAPI;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   Panel1: TPanel;
   Timer1: TTimer;
   Button3: TButton;
   procedure Button1Click(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure Button2Click(Sender: TObject);
   procedure Timer1Timer(Sender: TObject);
   procedure Button3Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;
const WM_CAP_START = WM_USER;
WM_CAP_STOP = WM_CAP_START + 68;
WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;
WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;
WM_CAP_SAVEDIB = WM_CAP_START + 25;
WM_CAP_GRAB_FRAME = WM_CAP_START + 60;
WM_CAP_SEQUENCE = WM_CAP_START + 62;
WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;

function capCreateCaptureWindowA(lpszWindowName : PCHAR;
dwStyle : longint;
x : integer;
y : integer;
nWidth : integer;
nHeight : integer;
ParentWin : HWND;
nId : integer): HWND;
stdcall external 'AVICAP32.DLL';
var
 Form1: TForm1;

implementation
{$R *.dfm}

var hWndC : THandle;

procedure TForm1.Button1Click(Sender: TObject);
begin
hWndC := capCreateCaptureWindowA('My Own Capture Window',
WS_CHILD or WS_VISIBLE ,
0,
0,
Panel1.Width,
Panel1.Height,
Panel1.Handle,
0); //создаем область для вывода получаемых в будущем картинок =)

if hWndC <> 0 then //если при создании области ошибок не возникло, то сопкойно начинаем забирать данный с веб-камеры
SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);  //забираем картинку с вебкамеры

end;

procedure TForm1.FormCreate(Sender: TObject);
begin
 hWndC := 0;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
 if hWndC <> 0 then
 begin
   SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);  //"отключаемся" от веб-камеры
   hWndC := 0;
 end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
if hWndC <> 0 then SendMessage(hWndC, WM_CAP_GRAB_FRAME, 0, 0); //забираем картинку с вебкамеры
end;

procedure TForm1.Button3Click(Sender: TObject);
begin
  // снимок в jpg
end;

end.


И. Павел   (2011-02-02 20:53:00) [21]

Еще можно почитать msdn и использовать callback функцию, сapVideoStreamCallback, которая:

> used with streaming capture to optionally process a frame
> of captured video.


И. Павел   (2011-02-02 20:40:00) [22]


> вопрос как тоже самое сохранять в jpg формате?

Если использовать этот способ, то, очевидно, нужно загрузить bmp-файл в битмап и конвертировать его вот так:
http://delphidevelop.ru/publ/15-1-0-163
А потом bitmep удалить. Хотя не понятно, зачем такие сложности.


vegarulez   (2011-02-02 20:32:00) [23]

так  сохраниение вроде сделал
нашел кусочек кода - вставил всё рабит

procedure TForm1.Button3Click(Sender: TObject);
var
 saveDialog1 : TSaveDialog;
begin
 saveDialog1 := TSaveDialog.Create(self);
  // снимок в jpg
if hWndC <> 0 then begin
  SaveDialog1.DefaultExt := 'bmp';
  SaveDialog1.Filter := 'Bitmap files (*.bmp)|*.bmp';
  if SaveDialog1.Execute then
    SendMessage(hWndC,
                WM_CAP_SAVEDIB,
                0,
                longint(pchar(SaveDialog1.FileName)));

end;
end;


вопрос как тоже самое сохранять в jpg формате?


i_p_pavel@mail.ru   (2011-02-02 20:28:00) [24]

А у TPanel канвы нет.


И. Павел   (2011-02-02 20:27:00) [25]

Используйте не Panel, а, например, TForm. У формы есть канва. Ее можно прочитать и скопировать на другую канву. Т.е. создайте Form2 и в capCreateCaptureWindowA передавайте именно ее дескриптор (хотя для теста можно и Form1 использовать).

Но, ИМХО, все же лучше взглянуть в сторону DSPack.


vegarulez   (2011-02-02 20:12:00) [26]

Я конечно чайник в этом вопросе
раз там изображение выдаётся на канву TPanel, то как при нажатии на кнопку загружать канву Tpanel`а в Timage а  там уже есть допустим процедура savetofile. Соответсвенно тогда вопрос как взять изображение в Tpanel и поместить в Timage


И. Павел   (2011-02-02 19:28:00) [27]

Наверное, можно использовать не панель, а что-нибудь с канвой, и оттуда читать пиксели. Правда, это кривовато. Лучше использовать DSPack.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо