![]() |
| ||
|
|
Новости |
Поиск |
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.
RWolf (2011-02-11 10:51:00) [1]
> Студент (10.02.11 23:16) [26]
сохранять картинку с вебкамеры в PNG неразумно, он не для этого предназначен. Lossless форматы плохо сжимают фотографии.
Студент (2011-02-10 23:16:00) [2]
> SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0); //забираем
> картинку с вебкамеры
Это в смысле "забираем картинку"? Тут же прям в константе написано - "подключиться к драйверу"...
Я вообще не понимаю в чём проблема-то? С веб-камерами не работал, но тут же есть и hdc и hwnd - всё тривиально...
И при чём тут вообще TPanel?? TPanel просто окно-родитель для создаваемого функцией окна дочернего, на TPanel ничего и не рисуется...
> vegarulez (02.02.11 22:50) [15]
> Пытаюсь передать дескриптор окна -
Функции нужно hdc, а вы ему hwnd суёте... Вот и не работает ничего...)
Даже я таких ошибок давно уже не делаю... :)
var Form1: TForm1; hWndC: HWND; hWndDC: HDC;
...
hWndC:=capCreateCaptureWindowA(...)
hWndDC:=GetDC(hWndC);
Image1.Picture.Bitmap.Width:=Panel1.Width;
Image1.Picture.Bitmap.Height:=Panel1.Height;
...
BitBlt(Image1.Picture.Bitmap.Canvas.Handle, 0, 0, Panel1.Width, Panel1.Height, hWnd DC, 0, 0, SRCCOPY);
Image1.Repaint;
...
ReleaseDC(hWndC, hWndDC);
А делать hWndC:=0; имхо неправильно... Вообще я б переделал весь код немного... Да и сохраняет пусть в png, jpg - прошлый век... :)
vegarulez (2011-02-10 22:14:00) [3]Сделал вот так:
procedure TForm1.Button3Click(Sender: TObject);
var
bmp:tbitmap;
jpg:TJPEGImage;
begin
// снимок в jpg
if hWndC <> 0 then begin
SendMessage(hWndC,
WM_CAP_SAVEDIB,
0,
longint(pchar('./123.bmp')));
bmp := TBitMap.Create;
bmp.LoadFromFile('./123.bmp');
jpg := BMP_To_JPG(bmp);
jpg.SaveToFile('./123.jpg');
end;
end;
криво. но по другому не умею... поэтому нид хелп.
vegarulez (2011-02-10 22:12:00) [4]c WinAPI разбираться надо долго и упорно - для меня это какой-то страшный лес куда даже заходить боюсь ибо потеряюсь там... (
И. Павел (2011-02-10 08:37:00) [5]> [21] vegarulez (09.02.11 23:25)
Вот что значит заранее четко и жестко сформульрована задача: захват картинки именно с TPanel и ни шагу в сторону :) И никаких там TForm с удобными канвасами, сторонних компонент и WinAPI - все это для слабаков, не умеющих решать задачи собственными силами :)
KilkennyCat (2011-02-10 01:14:00) [6]
>
> но hWndC=0
в каком месте-то?
vegarulez (2011-02-09 23:25:00) [7]Комрады...
ну так всё же как передать в BMP_To_JPG картинку с TPanel?
vegarulez (2011-02-02 23:51:00) [8]DVM © (02.02.11 23:35) [19]
палин ну не шарю.
Пытаюсь сделать как можно быстрее.
Подскажи про
vegarulez (02.02.11 23:35) [18]
DVM (2011-02-02 23:35:00) [9]
> vegarulez (02.02.11 22:50) [15]
> bitblt(bmp.Canvas.Handle, 0, 0, Panel1.Width, Panel1.Height,
>
> hWndC, 0, 0, SRCCOPY);
Ты читал в справке про параметры функции bitblt? Какой к лешему hWndC ?
vegarulez (2011-02-02 23:35:00) [10]пытаюсь вместо tpanel сделать сразу через bmp
procedure TForm1.AllClick(Sender: TObject);
var
bmp:tbitmap;
jpg:TJPEGImage;
begin
bmp := TBitMap.Create;
bmp.Height:=240;
bmp.Width:=320;
hWndC := capCreateCaptureWindowA('My Own Capture Window',
WS_CHILD or WS_VISIBLE ,
0,
0,
bmp.Width,
bmp.Height,
bmp.Handle,
0); //создаем область для вывода получаемых в будущем картинок =)
if hWndC <> 0 then //если при создании области ошибок не возникло, то сопкойно начинаем забирать данный с веб-камеры
SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0); //забираем картинку с вебкамеры
if hWndC <> 0 then
SendMessage(hWndC, WM_CAP_GRAB_FRAME, 0, 0); //забираем картинку с вебкамеры
jpg := BMP_To_JPG(bmp);
jpg.SaveToFile('./123.jpg');
if hWndC <> 0 then
begin
SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0); //"отключаемся" от веб-камеры
hWndC := 0;
end;
end;
но hWndC=0
((((
что делаю не так?
vegarulez (2011-02-02 23:31:00) [11]ок - ну это всё потом.
сейчас подскажите как мне кадр сохранить в jpg файл.
DVM (2011-02-02 23:21:00) [12]Для одиночных кадров с камер удобнее использовать twain - почти все драйвера поддерживают twain интерфейс.
Video for Windows устарело, лучше использовать Direct Show.
vegarulez (2011-02-02 22:50:00) [13]Пытаюсь передать дескриптор окна -
bitblt(bmp.Canvas.Handle, 0, 0, Panel1.Width, Panel1.Height,
hWndC, 0, 0, SRCCOPY);
но сохраняет почему то в таком случае файл в котором всё белое.
Как правильно это сделать?
vegarulez (2011-02-02 22:47:00) [14]И. Павел © (02.02.11 22:39) [12]
долго разбираться. Мне нужно ещё вчера. не игнорируют просто уже практически всё готово - нужно лишь сохранять не в bmp а в jpg.
Не хватает знаний - чтобы это правильно сделать.
vegarulez (2011-02-02 22:46:00) [15]И. Павел © (02.02.11 22:27) [10]
неа не пробовал.
можно
сделать через
bitblt
подскажите по синтаксису. плз.
И. Павел (2011-02-02 22:39:00) [16]Вспоминается бородатый анекдот:
- Доктор, помогите! Мне кажется, что все люди меня просто игнорируют...
- Следующий!
vegarulez (2011-02-02 22:34:00) [17]Наверно нужно создать переменную TMemoryStream туда скинуть а потом с помощью LoadFromStream загрузить это всё в TBitmap.
Комрады подскажите синтаксис как всё это сделать... идея есть - реализация хромает ))
И. Павел (2011-02-02 22:27:00) [18]
> я так понимаю в SendMesssage только указатели.
> Комрады как в tbitmap залить по этим указателям?
В Send Message нет никаких указателей на битмапы. Это просто функция отправки сообщения WM_CAP_SAVEDIB. Ей передается дескриптор окна, код сообщения и два параметра - и все. Чужое окно принимает это сообщение и сохраняет фрейм в файл. Ваша программа в этом сохранении не учавствует.
Чем вам не нравятся DSPack? Вы попробовали [7]?
vegarulez (2011-02-02 22:20:00) [19]грубо говоря как вот это
SendMessage(hWndC,
WM_CAP_SAVEDIB,
0,
longint(pchar(SaveDialog1.FileName)));
поместить в tbitmap.
я так понимаю в SendMesssage только указатели.
Комрады как в tbitmap залить по этим указателям?
vegarulez (2011-02-02 22:17:00) [20]Так в Tbitmap можно же загрузить сразу из hWndC.
и произвести сразу конвертацию. и сохранить уже конвертированный файл.
Подскажите как это сделать.