![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
фото с вебкамеры. [D7, XP]
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.