Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Media";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];

Вниз

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 вся ветка

Форум: "Media";
Текущий архив: 2004.12.19;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.033 c
10-1043306145
greengl
2003-01-23 10:15
2004.12.19
Проблема с DCOM


1-1101998562
novice__man
2004-12-02 17:42
2004.12.19
Переменные в DLL.


1-1101978623
Майя
2004-12-02 12:10
2004.12.19
Сохранение файла Excel в Делфи


4-1098960284
MetalFan
2004-10-28 14:44
2004.12.19
Узнать данные по сессии CD


14-1101975214
Ditrix
2004-12-02 11:13
2004.12.19
психология программра





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский