![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как перевести Panel.Canvas в Image.Canvas ? [D6, Win2k]
palgen © (2005-08-24 07:24:00)Такая проблема ... Видеопоток (а точнее картинки с частотой 10 к/сек.) отображается на Panel. В процессе работы мне необходимо сканировать эти картинки, используя Pixels[x,y], но у Panel такой возможности нет. У Image есть. Поэтому я хочу переносить поток с Panel.Canvas в Image.Canvas ... Подскажите как это сделать ... Есть ли другие варианты ?
palgen (2005-08-25 07:20:00) [1]А можно ли всё это связать с компонентом VideoCap - он отображает видеопоток и у него есть хендл ... ?
Antonn (2005-08-24 16:16:00) [2]palgen © (24.08.05 15:42) [13]
наверно потому, что на канвасе ничего нет... см. [9]. А еще попробуй запустить в фоне просмотр фильма, и попробуй код, може получится
palgen © (24.08.05 15:42) [13]
Когда вывожу на форму Form1.Handle
хендл - это число, на него не выводят, через него щупают форму:)
palgen (2005-08-24 15:42:00) [3]Когда вывожу на форму Form1.Handle и считываю с формы, то все значения R1, G1, B1 равны 255, т.е. белый цвет. Почему ?
Antonn (2005-08-24 15:20:00) [4]palgen © (24.08.05 15:12) [11]
что именно не получается?
palgen (2005-08-24 15:12:00) [5]Что-то никак не получается ...
Antonn (2005-08-24 14:48:00) [6]кстати, а если попробывать TPAinBox?
Antonn (2005-08-24 13:49:00) [7]palgen © (24.08.05 13:12) [8]
А рисуется на хендле
а хендл чего? в коде [3] хендл окна, и область вывода, вот и предполагаю что оверлей. т.е. нифига не получишь пиксел. замени Panel1.Left,Panel1.Top,Panel1.Width,Panel1.Height любым другим контроллом, попробуй
palgen (2005-08-24 13:12:00) [8]>а если image.picture.canvas? только надо у этого самого >image.picture размеры выставить:
>image.picture.width:=Panel1.Width;
>image.picture.heigth:=Panel1.Height;
>А вообще не пойму, каким образом на самой панели рисуется, ни ее хендла не передается, ничего. Может оверлей?..
Image1.picture.width := Panel1.Width;
Image1.picture.Height := Panel1.Height; => Cannot assign to read-onli property
Вот так вот ...
А рисуется на хендле
//=====================
private
{ Private declarations }
hWndC: THandle;
DVM (2005-08-24 13:11:00) [9]
> Как мне приспособить Panel ?
DC := GetDC(Panel.Handle);
ClrRef:=GetPixel(DC, X, Y);
R1 := GetRValue(ClrRef);
G1 := GetGValue(ClrRef);
B1 := GetBValue(ClrRef);
palgen (2005-08-24 13:06:00) [10]> В любом случае DC у панели имеется. А с пом GetPixel() можно получить инфу о состоянии пиксела.
Я использую GetRValue, RetGValue и GetBValue - вот фрагмент кода
//===========================================================
var
x, y, R1, G1, B1: integer;
=======
R1 := GetRValue(Form1.Image1.Canvas.Pixels[x,y]);
G1 := GetGValue(Form1.Image1.Canvas.Pixels[x,y]);
B1 := GetBValue(Form1.Image1.Canvas.Pixels[x,y]);
//===========================================================
Как мне приспособить Panel ?
DVM (2005-08-24 10:17:00) [11]
> В процессе работы мне необходимо сканировать эти картинки,
> используя Pixels[x,y], но у Panel такой возможности нет.
В любом случае DC у панели имеется. А с пом GetPixel() можно получить инфу о состоянии пиксела.
Antonn (2005-08-24 09:36:00) [12]
> Пробовал на Image.canvas - у меня белый экран ...
а если image.picture.canvas? только надо у этого самого image.picture размеры выставить:
image.picture.width:=Panel1.Width;
image.picture.heigth:=Panel1.Height;
А вообще не пойму, каким образом на самой панели рисуется, ни ее хендла не передается, ничего. Может оверлей?..
palgen (2005-08-24 08:03:00) [13]function capCreateCaptureWindowA(lpszWindowName: PCHAR;
dwStyle: longint;
x: integer;
y: integer;
nWidth: integer;
nHeight: integer;
ParentWin: HWND;
nId: integer): HWND;
stdcall external 'AVICAP32.DLL';
//==============================================================
procedure TForm1.OpenVideoClick(Sender: TObject);
begin
hWndC := capCreateCaptureWindowA('My Own Capture Window',
WS_CHILD or WS_VISIBLE,
Panel1.Left,
Panel1.Top,
Panel1.Width,
Panel1.Height,
Form1.Handle,
0);
if hWndC <> 0 then
SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);
end;
//==============================================================
Пробовал на Image.canvas - у меня белый экран ...
palgen (2005-08-24 08:00:00) [14]Я использую библиотеку 'AVICAP32.DLL' и команды WM_CAP_GRAB_FRAME ,WM_CAP_DRIVER_CONNECT и WM_CAP_DRIVER_DISCONNECT. Это все отображается("видеопоток") на Panel.
Antonn (2005-08-24 07:30:00) [15]
> используя Pixels[x,y],
может лучше scanline? реально скорая штука.
> отображается на Panel.
каким образом, вообще откуда поток?