AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia Delphi ActiveX.Image -> Buffer --> TBitmap
Thema durchsuchen
Ansicht
Themen-Optionen

ActiveX.Image -> Buffer --> TBitmap

Ein Thema von cylor · begonnen am 9. Okt 2008 · letzter Beitrag vom 10. Okt 2008
Antwort Antwort
Seite 1 von 2  1 2      
cylor

Registriert seit: 9. Okt 2008
7 Beiträge
 
#1

ActiveX.Image -> Buffer --> TBitmap

  Alt 9. Okt 2008, 14:42
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
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#2

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

  Alt 9. Okt 2008, 14:57
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
Klaus
  Mit Zitat antworten Zitat
cylor

Registriert seit: 9. Okt 2008
7 Beiträge
 
#3

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

  Alt 9. Okt 2008, 15:31
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
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#4

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

  Alt 9. Okt 2008, 15:44
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:

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

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
cylor

Registriert seit: 9. Okt 2008
7 Beiträge
 
#5

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

  Alt 9. Okt 2008, 15:50
Nein der will ein Integer kein Pointer.
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#6

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

  Alt 9. Okt 2008, 15:55
ActiveX1.CopyImage(Cardinal(pBuffer), image_buffer_size);
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat
cylor

Registriert seit: 9. Okt 2008
7 Beiträge
 
#7

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

  Alt 9. Okt 2008, 16:14
Aha Cardinal() heisst das Zauberwort. Ich hatte es mit Integer() versucht. Danke!

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.
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#8

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

  Alt 9. Okt 2008, 16:20
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
SetBitmapBits(Image1.Picture.Bitmap.Handle, ueye_picture_buffer_size, pBuffer);
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat
cylor

Registriert seit: 9. Okt 2008
7 Beiträge
 
#9

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

  Alt 9. Okt 2008, 16:23
Nein macht leider auch nichts. Gibt es ne andere Möglichkeit den Buffer in ein TBitmap zu packen?

mfg Lars
  Mit Zitat antworten Zitat
Benutzerbild von littleDave
littleDave

Registriert seit: 27. Apr 2006
Ort: München
556 Beiträge
 
Delphi 7 Professional
 
#10

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

  Alt 9. Okt 2008, 16:42
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;
Jabber: littleDave@jabber.org
in case of 1 is 0 do external raise while in public class of object array else repeat until 1 is 0
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:41 Uhr.
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