Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi ActiveX.Image -> Buffer --> TBitmap (https://www.delphipraxis.net/122103-activex-image-buffer-tbitmap.html)

cylor 9. Okt 2008 13:42


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

Klaus01 9. Okt 2008 13:57

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

cylor 9. Okt 2008 14:31

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:
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);
   ...
Und wie kommt ich dann das Bild aus dem Buffer ins TImage?

mfg Lars

Klaus01 9. Okt 2008 14:44

Re: ActiveX.Image -> Buffer --> TBitmap
 
Zitat:

Zitat von cylor
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:
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);
   ...
Und wie kommt ich dann das Bild aus dem Buffer ins TImage?

mfg Lars

Meines bescheidenen Wissens sollte das so gehen:

Delphi-Quellcode:
ActiveX1.CopyImage(pBuffer, image_buffer_size);
denn pBuffer ist ein Pointer also auch "nur" eine Adresse.

Grüße
Klaus

cylor 9. Okt 2008 14:50

Re: ActiveX.Image -> Buffer --> TBitmap
 
Nein der will ein Integer kein Pointer.

littleDave 9. Okt 2008 14:55

Re: ActiveX.Image -> Buffer --> TBitmap
 
Delphi-Quellcode:
ActiveX1.CopyImage(Cardinal(pBuffer), image_buffer_size);

cylor 9. Okt 2008 15:14

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:
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;
Kann ich SetBitmapBits an der stelle benutzten? So anscheint nicht, weil das Image bleibt leer. Aber immerhin kommt schon mal keine Zugriffverletzung mehr. :?

littleDave 9. Okt 2008 15:20

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

cylor 9. Okt 2008 15:23

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

littleDave 9. Okt 2008 15:42

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 01:47 Uhr.
Seite 1 von 2  1 2      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz