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

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

Как перевести 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.

каким образом, вообще откуда поток?


Наверх

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