![]() |
ActiveX.Image -> Buffer --> TBitmap
Hallo!
So einigermaßen versteh ich ja das Prinzip von Pointern und so aber irgendwie beiße ich mir hir heute an einem Problem die Zähne aus. Ich hab hier ein recht tolle Kamera, die mir 1024x768 8bit grayscale Bilder liefert. Der Hersteller stellt auch eine ActiveX-Komponente zur Verfügung. Diese besitzt nun folgende Funktion: ------------------------ CopyImage Syntax: LONG CopyImage (LONG pBuffer, LONG lSize) Description: This function copies the actual image into the given buffer. Parameter Description: pBuffer: pBuffer is interpreted as the address of the destination image. lSize: Number of bytes to copy. The buffer must be at least lSize Bytes in size ------------------------ Ich will mir jetzt so ein Bild in den Speicher packen, es bearbeiten/analysieren können und dann anzeigen lassen. Den Bearbeitungs-Teil aussen vor schaffe ich es nichtmal es anzeigen zu lassen. Vielleicht kann mir jemand einen Tip geben. - Eine Form mit der ActiveX-Komponente und einem TImage. - Ich mach mir ein Integer: image_buffer_size := 1024*768*8 Nun scheiter ich daran, die TImage.Picture.Bitmap Speicheradresse irgendwie als Integer zu bekommen um mit CopyImage(pBuffer, image_buffer_size) das Bild im TImage anzeigen zu lassen. mfg Lars |
Re: ActiveX.Image -> Buffer --> TBitmap
Hi Lars,
mit image_buffer_size := 1024*768*8 machst Du keinen Buffer mit der Größe 1024*768*8 Du weist der Variable nur das Ergebnis der Berechnung zu. Du könntest Dir ein dynamisches oder statisches Array erstellen und dies dann befüllen. Oder Du schaust Dir mal die Prozedur getMem an. Ein Beispiel dazu findest Du in der Delphi Hilfe. Grüße Klaus |
Re: ActiveX.Image -> Buffer --> TBitmap
Ja das ist mir schon klar, dass das nicht der Buffer ist, sonder nur die Größe des Buffers. ^^
Mit getMem hab ich schon rumgespielt. Etwa sowas:
Delphi-Quellcode:
Und wie kommt ich dann das Bild aus dem Buffer ins TImage?
var pBuffer: Pointer;
begin image_buffer_size := 1024*768*8; GetMem(pBuffer, image_buffer_size); ... ActiveX1.CopyImage(?Adresse von pBuffer als Integer?, image_buffer_size); ... mfg Lars |
Re: ActiveX.Image -> Buffer --> TBitmap
Zitat:
Delphi-Quellcode:
denn pBuffer ist ein Pointer also auch "nur" eine Adresse.
ActiveX1.CopyImage(pBuffer, image_buffer_size);
Grüße Klaus |
Re: ActiveX.Image -> Buffer --> TBitmap
Nein der will ein Integer kein Pointer.
|
Re: ActiveX.Image -> Buffer --> TBitmap
Delphi-Quellcode:
ActiveX1.CopyImage(Cardinal(pBuffer), image_buffer_size);
|
Re: ActiveX.Image -> Buffer --> TBitmap
Aha Cardinal() heisst das Zauberwort. Ich hatte es mit Integer() versucht. Danke!:P
Mein Code schaut nu so aus:
Delphi-Quellcode:
Kann ich SetBitmapBits an der stelle benutzten? So anscheint nicht, weil das Image bleibt leer. Aber immerhin kommt schon mal keine Zugriffverletzung mehr. :?
var pBuffer: Pointer;
begin GetMem(pBuffer, ueye_picture_buffer_size); uEyeCam1.CopyImage(Cardinal(pBuffer), ueye_picture_buffer_size); SetBitmapBits(Image1.Picture.Bitmap.Handle, ueye_picture_buffer_size, @pBuffer); end; |
Re: ActiveX.Image -> Buffer --> TBitmap
Weiß nicht, ob das mit SetBitmapBits funktioniert, kannte die Funktion bis gerade nicht. Jedoch ist wahrscheinlich das @pbuffer in SetBitmapBits falsch - einen Pointer auf einen Pointer erwartet die Funktion wahrscheinlich nicht -> folgendes ausprobieren
Delphi-Quellcode:
SetBitmapBits(Image1.Picture.Bitmap.Handle, ueye_picture_buffer_size, pBuffer);
|
Re: ActiveX.Image -> Buffer --> TBitmap
Nein macht leider auch nichts. Gibt es ne andere Möglichkeit den Buffer in ein TBitmap zu packen?
mfg Lars |
Re: ActiveX.Image -> Buffer --> TBitmap
Also mir fällt noch ScanLine ein.
Ich würd es mal so ähnlich versuchen:
Delphi-Quellcode:
const
ImgWidth = 1024; ImgHeight = 768; BufferSize = ImgWidth * ImgHeight * 3; // 24 Bit Farbtiefe, 8 Bit Farbtiefe wäre * 1 var bmp : TBitmap; pBuffer : pointer; iSize : cardinal; begin GetMem(pBuffer, BufferSize); try iSize := uEyeCam1.CopyImage(Cardinal(pBuffer), BufferSize); bmp := TBitmap.Create; try bmp.Width := ImgWidth; { die Breite des Bildes im Puffer } bmp.Height := ImgHeight; { die Höhe des Bildes im Puffer } bmp.PixelFormat := pf24Bit; { das Pixelformat }; // Inhalt des Bildes kopieren Move(pBuffer^, bmp.ScanLine[bmp.Height-1]^, iSize); // Bild auf MainForm zeichen BitBlt(Form1.Canvas.Handle, 0, 0, ImgWidth, ImgHeight, bmp.Canvas.Handle, 0, 0, SRCCOPY); finally bmp.Free; end; finally FreeMem(pBuffer); end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:12 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz