Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.12.19;
Скачать: CL | DM;

Вниз

HDC   Найти похожие ветки 

 
debuger ©   (2004-09-21 17:38) [0]

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


 
Mihey_temporary ©   (2004-09-21 19:46) [1]

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


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

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 - самый что ни наесть обычный массив. Динамический :))


 
debuger ©   (2004-09-21 21:02) [3]

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


 
Рыба ©   (2004-09-21 21:14) [4]

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

Bitmap: TBitmap;

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


 
debuger ©   (2004-09-21 22:49) [5]

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

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 );

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


 
Mihey_temporary ©   (2004-09-21 23:17) [6]

2 debuger:

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


 
debuger ©   (2004-09-21 23:25) [7]

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

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


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


> AVER_PaintOverlay( pRect );


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

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


 
debuger ©   (2004-09-22 17:46) [9]

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


 
Mihey_temporary ©   (2004-09-22 19:48) [10]


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


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



Страницы: 1 вся ветка

Текущий архив: 2004.12.19;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.026 c
1-1102086014
Vega
2004-12-03 18:00
2004.12.19
отображение HTM


3-1101157948
Константинов
2004-11-23 00:12
2004.12.19
Простой вопросик. Доступ к полям БД


14-1101553392
KilkennyCat
2004-11-27 14:03
2004.12.19
А питерская предновогодняя встреча будет?


6-1097126516
Sirus
2004-10-07 09:21
2004.12.19
Как запретить компу принимать и отправлять данные на опред. IP ?


14-1101823807
Jeer
2004-11-30 17:10
2004.12.19
Поэтическая Windows:)