Od razu napisze, że nie chcę tutaj używać komponentów :d Czy ktos wie jak można zapisać obraz z kamery bezpośrednio do zmiennej typu Tbitmap? Jak na razie znalazlem tylko zapis do schowka:

function TCapture.VideoBufferToClipboard: longbool;
begin
  result:=longbool(SendMessage (wHandle,WM_CAP_EDIT_COPY,0,0));
end;

i zapis do pliku:

function TCapture.FrameToBitmapFile(const Filename: string): longbool;
begin
   SendMessage(wHandle,WM_CAP_GRAB_FRAME_NOSTOP,0,0);
   result:=longbool(SendMessage (wHandle,WM_CAP_FILE_SAVEDIBA,0,integer(pointer(Filename))));
end;

tutaj jest lista komunikatów: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/multimed/htm/_win32_video_capture_messages.asp

Może ktoś już coś takiego robił, albo ewentualnie zna komponent który posiada taką funkcję, to coś się z niego wyciągnie?

Nie wiem czy myślę w dobrym kierunku, ale może da sie zamiast "integer(pointer(Filename))" wstawić jakiś wskaźnik, albo wysłać to do strumienia? Jeśli ktoś ma pomysl, i wie jak to zrobić to bardzo prosze o jakiś prrykład, bo mecze sie z tym od 2 dni :/

Dodam jeszcze, że zapisywanie i odczytywanie na dysk odpada, bo program ma działać jako wykrywacz ruchu i musi pobierać obraz z kamery przynajmniej 2 razy na sekundę. Gdy zapisuje na dysk to program strasznie zwalnia, a jeśli obsługę kamery dam jako nowy wątek to w ogóle nie może jej 'zalogować' do sterownika, czy jak to sie nazywa :p. Schowek tez odpada.


jeszcze znalazlem ten komunikat: "The WM_CAP_GRAB_FRAME_NOSTOP message fills the frame buffer with a single uncompressed frame from the capture device and displays it." tylko czy da się odczytać jakoś ten bufor o którym jest mowa?
kolejne co znalazlem i moze to juz jest to: http://dotnetjunkies.com/WebLog/principal/articles/32662.aspx

a dokladniej ten fragmet:

private void FrameCallBack(IntPtr lwnd, IntPtr lpVHdr)
{
API32.VIDEOHDR videoHeader = new API32.VIDEOHDR();
byte[] VideoData;
videoHeader = (API32.VIDEOHDR)API32.GetStructure(lpVHdr, videoHeader);
VideoData = new byte[videoHeader.dwBytesUsed];
API32.Copy(videoHeader.lpData, VideoData);
System.Drawing.Bitmap bmp = new Bitmap(352, 288);
System.Drawing.Imaging.BitmapData bmpData = bmp.LockBits(new Rectangle(0, 0, 352, 288), ImageLockMode.ReadWrite, PixelFormat.Format24bppRgb);
// Copy the data from memory to the Scan0 property of our Bitmap
for (int i = 0; i < VideoData.Length; i++)
Marshal.WriteByte(bmpData.Scan0 , i,VideoData[i]);
bmp.UnlockBits(bmpData);
if (this.RecievedFrame != null)
{
WebCameraEventArgs e = new WebCameraEventArgs(VideoData, bmp);
this.RecievedFrame(this,e);
}
}

moze ktos umie to tak przerobic zeby dzialalo na funkcji:

function FrameCallback(Hwnd:cardinal;vHeader:pVIDEOHDR):cardinal; stdcall;
var
owner:TCapture;
begin
owner:=TCapture(GetProp(hwnd,pansichar('OwnerObject')));
if assigned(owner.cbFrame) then owner.cbFrame(owner,vHeader);
end;