Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Bild aus pByte speichern (https://www.delphipraxis.net/193406-bild-aus-pbyte-speichern.html)

Graw 27. Jul 2017 07:24

Bild aus pByte speichern
 
Guten Morgen,

ich habe eine µEye Kamera von IDS.
Wie folgt kann ich das aktuelle Livebild in einem Panel anzeigen:
Code:
If (pImgMem <> nil) then is_RenderBitmap (hC, FrameId, pnuEye.Handle, DisplayMode)
pnuEye ist das Panel.

Die Bilddaten liegen in: pImgMem : pByte;

Das aktuelle Bild würde ich nun gerne speichern...
In dem pImgMem liegt ein Bild mit einer FullHD Auflösung, weshalb ich nicht einfach einen "Screenshot" von dem Panel amchen kann.
Hier würde ich dann zu viel Auflösung verlieren.
Leider weiß ich nicht wie ich das machen kann.
Über eure Hilfe wäre ich sehr Dankbar.

CarlAshnikov 27. Jul 2017 07:57

AW: Bild aus pByte speichern
 
Hallo,

kann man das Bild auf den Canvas eines TBitmap rendern lassen?

Delphi-Quellcode:
var
  bm: TBitMap;
begin
  bm := TBitMap.Create();
  try
    is_RenderBitmap (hC, FrameId, bm.Canvas.Handle, DisplayMode);
    bm.SaveToFile('test.bmp');
  finally
    bm.Free();
  end;
end;

Graw 27. Jul 2017 08:24

AW: Bild aus pByte speichern
 
Dann kommt beim öffnen des Bildes:
Das Bild kann nicht angezeigt werden, da die Datei leer ist.

Neutral General 27. Jul 2017 08:27

AW: Bild aus pByte speichern
 
Setz mal vorher die Höhe und Breite des Bitmaps.

Graw 27. Jul 2017 08:36

AW: Bild aus pByte speichern
 
Dann ist das erzeugte Bild nur weiß.

Rollo62 27. Jul 2017 09:34

AW: Bild aus pByte speichern
 
Vielleicht geht es ja mit einem unsichtbaren TImage, statt des TBitmap.
Das ist ein echtes Control und hat womöglich einen Canvas-Handle vom System.
Könnte aber sein das unsichtbare Controls gar nicht erst gezeichnet werden.

Rollo

Neutral General 27. Jul 2017 09:38

AW: Bild aus pByte speichern
 
Wenn du weißt wie groß das Bild hinter pImgMem ist, kannst du auch einfach die Daten hinter pImgMem in einen Stream packen und abspeichern.
Das wäre dann wahrscheinlich das einfachste.

CarlAshnikov 27. Jul 2017 09:59

AW: Bild aus pByte speichern
 
Wenn man nur die rohen Bilddaten hat, muss man sich den passenden bitmap header generieren um das korrekt speichern zu können. Hier im Forum suchenbitmap header

Edit:

Wie wäre es die Funktionen direkt von IDS zu nehmen: is_saveimage oder is_imagefile?

TiGü 27. Jul 2017 11:06

AW: Bild aus pByte speichern
 
Was sagt denn die Doku genau zu pImgMem? Ist das schon ein fertiges Bitmap, also mit den erforderlichen Headern, oder der reine Bildbuffer?
Wieviele Bits sind denn pro Bildpunkt vorhanden? 8-, 16-, 24-, 32-Bit? Kennst du die Größe des Buffers in Bytes? In der Regel bei Bitmap wäre das Höhe mal Breite mal 4.
Ist es wirklich unkomprimiertes Material oder muss man das erst einer JPEG-Dekodierung unterziehen?

Hier mal ein kleines Beispiel. Das Array MyBytes, die per Zufall gefüllt wird, entspricht dann deinen Bildbuffer, wo pImgMem drauf zeigt:

Delphi-Quellcode:
var
  MyStream: TStream;
  MyBitmap: TBitmap;
  MyBytes: TBytes;
  BitmapSize: Integer;
  I: Integer;
  BitmapInfo: TBitmapInfo;
  BitmapFileHeader: TBitmapFileHeader;
  pImgMem: PByte;
  BitmapHeight, BitmapWidth: Integer;
begin
  BitmapWidth := 1 * 1920;
  BitmapHeight := 1 * 1080;
  BitmapSize := BitmapWidth * BitmapHeight * 4;
  SetLength(MyBytes, BitmapSize);

  for I := Low(MyBytes) to High(MyBytes) do
  begin
    MyBytes[I] := RandomRange(Low(Byte), High(Byte));
  end;

  FillChar(BitmapInfo, SizeOf(BitmapInfo), 0);
  BitmapInfo.bmiHeader.biSize := SizeOf(BitmapInfo.bmiHeader);
  BitmapInfo.bmiHeader.biHeight := -BitmapHeight;
  BitmapInfo.bmiHeader.biWidth := BitmapWidth;
  BitmapInfo.bmiHeader.biPlanes := 1;
  BitmapInfo.bmiHeader.biBitCount := 32;

  FillChar(BitmapFileHeader, SizeOf(BitmapFileHeader), 0);
  BitmapFileHeader.bfType := $4D42;

  MyStream := TMemoryStream.Create;
  MyStream.Write(BitmapFileHeader, SizeOf(BitmapFileHeader));
  MyStream.Write(BitmapInfo, SizeOf(BitmapInfo));

  pImgMem := @MyBytes[0];
  MyStream.Write(pImgMem^, BitmapSize);
  MyStream.Position := 0;

  MyBitmap := TBitmap.Create;
  MyBitmap.LoadFromStream(MyStream);

  ForceDirectories('C:\Test');
  MyBitmap.SaveToFile('C:\Test\Test1.bmp');

  MyStream.Free;
  MyBitmap.Free;
end;

Graw 27. Jul 2017 13:50

AW: Bild aus pByte speichern
 
:oops:
Die Lösung kann so einfach sein...
Vielen dank an alle, besonders an CarlAshnikov...
Mit is_saveimage hat es nun wunderbar geklappt.

:-D


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:26 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