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

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

HDC [D5, Win2k]


debuger ©   (2004-09-21 17:38:00) 

Я сотворил видеозахват, рисует он на TPanel. Как мне побыстрее содрать с TPanel картинку и запихнуть ее в обычный массив?


Mihey_temporary   (2004-09-22 19:48:00) [1]


> debuger ©   (22.09.04 17:46) [9]


Есть способы сдирания и с оверлеев. Ищи инфу.


debuger   (2004-09-22 17:46:00) [2]

Вот именно! Если бы изображение с панельки сдиралось на такую шару, я бы не спрашывал. А так все что я могу с нее сдереть это - пустой скриншот.


Mihey_temporary   (2004-09-22 00:06:00) [3]


> AVER_PaintOverlay( pRect );


Мне не нравится эта фраза. Overlay - это особая поверхность DirectX, на простой захват не берётся.

Попробуй сделать всё таки TPanel.PaintTo на TBitmap.Canvas.Handle и сохранить TBitmap. Если изображения нет, то и тот код выше не получится.


debuger   (2004-09-21 23:25:00) [4]

Видеозахват через родное карточкино СДК:
AVER_Init( Panel1.Handle );
AVER_PaintOverlay( pRect );

Вопрос в том как с Панельки скопировать изображение в статический массив.


Mihey_temporary   (2004-09-21 23:17:00) [5]

2 debuger:

Каким образом делаешь видеозахват с карточки? Выводится ли изображение на панель или в этом проблема? Дело в том, что в том примере с AVI указатель bits получает адрес из pbmi, который в свою очередь из функции работы с AVI. Как происходит во втором случае, если происходит вообще?


debuger   (2004-09-21 22:49:00) [6]

Я посараюсь пояснить что к чему. Для начала смотрим кусок кода.

var
 FrameCurrent : TBitmap;
 AviStream : PAVISTREAM;
 Frame : PGetFrame;
 pbmi : PBITMAPINFOHEADER;
 bits : Pointer;
 wrkDC: HDC;

кусок кода:

 pbmi := AVIStreamGetFrame(Frame, CurrFrame);

 if CurrFrame = 0 then bits := Pointer(Integer(pbmi) + SizeOf(TBITMAPINFOHEADER));

 wrkDC := GetDC(Panel1.Handle);
 
 FrameCurrent.Handle := CreateDIBitmap(
   wrkDC,
   pbmi^,
   CBM_INIT,
   bits,
   PBITMAPINFO(pbmi)^,
   DIB_RGB_COLORS );

 BitBlt (wrkDC,
   0,
   0,
   AVIWidth,
   AVIHeight,
   FrameCurrent.Canvas.Handle,
   0,
   0,
   SRCCOPY);

Тут на панельку рисуется авишка, потом криатиться битмапа и все в нее отлично капируется.

Потом видеозахват стал не с авишки, а с карточки, на ту же панельку и т.д. Я бы повторил все как в примере, но мне непонятна природа bits, и не до конца понятно как формировать структуру TBitMapInfoHeader.

Пробовал вместо CreateDIBitmap CreateCompatibleBitmap, выглядит так:

 wrkDC := GetDC(Panel1.Handle);
 
 FrameCurrent.Handle := CreateCompatibleBitmap(
   wrkDC,
   100,
   100 );

 BitBlt (wrkDC,
   0,
   0,
   AVIWidth,
   AVIHeight,
   FrameCurrent.Canvas.Handle,
   0,
   0,
   SRCCOPY);

но когда делаю FrameCurrent.SaveToFile( '1.bmp' )
то полученный файл черный, т.е. все пиксели черные и нима там и намека на мою картинку.

Или как мне создать Битмап с нормальным хендлом, что-бы использовать БитБлт.

Да, пробовал даже так:
 tmpCanvas := TCanvas.Create;
 
 wrkDC := GetDC(Panel1.Handle);
 tmpCanvas.Handle := wrkDC;

 MyCanvas.CopyRect( wRect, tmpCanvas, wRect );

и все равно нифиха не получаю.


Рыба   (2004-09-21 21:14:00) [7]

>debuger ©  (21.09.04 21:02) [3]

Bitmap: TBitmap;

TBitmap - класс для работы с растрами. Содержит двумерный массив пикселей. Подробнее читай в книгах.


debuger   (2004-09-21 21:02:00) [8]

Поподробней опишы появление BitMap, я немного не понял откуда он взялся и как именно.


Fenik   (2004-09-21 20:31:00) [9]

type
TMyPanel = class(TPanel);

procedure CopyPanelToBitmap(Panel: TPanel; Bitmap: TBitmap);
var R: TRect;
begin
 R := Panel.ClientRect;
 with Bitmap, R do
 begin
   Width := Right - Left;
   Height := Bottom - Top;
   Canvas.CopyRect(Rect(0, 0, Width, Height), TMyPanel(Panel).Canvas, R);
 end;
end;


Bitmap.Canvas.Pixels[x, y] - это почти обычный массив :))
Ну если нужно все таки в обычный массив. То вот -

type
 pRGB = ^TRGB;
 TRGB = packed record
   B, G, R: Byte;
 end;

var
 A: array of array of TRGB;
 x, y: Integer;
 Pixel: pRGB;

begin
 SetLength(A, Bitmap.Height);
 for y := 0 to Bitmap.Height - 1 do
 begin
   SetLength(A[y], Bitmap.Width);
   Pixel := Bitmap.ScanLine[y];
   for x := 0 to Bitmap.Width - 1 do
   begin
     A[y, x] := Pixel^;
     Inc(Pixel);
   end;
 end;
end;


Вот теперь A - самый что ни наесть обычный массив. Динамический :))


Mihey_temporary   (2004-09-21 19:46:00) [10]

Рисуй на TBitmap через TPanel.PaintTo. Далее Scanline.


Наверх

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