Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   MemoryStream / Bitmap header (https://www.delphipraxis.net/178369-memorystream-bitmap-header.html)

Zacherl 4. Jan 2014 14:24

AW: MemoryStream / Bitmap header
 
Sofern dein Stream ein MemoryStream ist und PSaveArray einfach nur ein Pointer auf ein ByteArray ist, müsste folgendes funktionieren:
Delphi-Quellcode:
SetPixelData(
    Pointer(NativeUInt(Stream.Memory) + SizeOf(TBitmapFileHeader)),
    Pointer(NativeUInt(Stream.Memory) + SizeOf(TBitmapFileHeader) + SizeOf(TBitmapInfoHeader)));

EWeiss 4. Jan 2014 14:50

AW: MemoryStream / Bitmap header
 
Zitat:

Zitat von Zacherl (Beitrag 1242115)
Sofern dein Stream ein MemoryStream ist und PSaveArray einfach nur ein Pointer auf ein ByteArray ist, müsste folgendes funktionieren:
Delphi-Quellcode:
SetPixelData(
    Pointer(NativeUInt(Stream.Memory) + SizeOf(TBitmapFileHeader)),
    Pointer(NativeUInt(Stream.Memory) + SizeOf(TBitmapFileHeader) + SizeOf(TBitmapInfoHeader)));

Danke werde es mal versuchen.

Habe das Speicherleck auch gefunden ;)
Nach jeden Durchlauf habe ich das Array von "posin" mit FillChar wieder auf 0 gesetzt.
Das führte dazu das der Speicher alle 1- 2 Min sich um 1 MB erhöht hat.
Hatte ich vorher auch noch nie so ein Problem.

gruss

EWeiss 4. Jan 2014 16:04

AW: MemoryStream / Bitmap header
 
Fehler gibt es keinen aber beim senden ändern sich die Farben nicht.
Muss mich da bei MP noch mal schlau machen.

Delphi-Quellcode:
  PSafeArray = ^TSafeArray;
  {$EXTERNALSYM tagSAFEARRAY}
  tagSAFEARRAY = record
    cDims: Word;
    fFeatures: Word;
    cbElements: Longint;
    cLocks: Longint;
    pvData: Pointer;
    rgsabound: array[0..0] of TSafeArrayBound;
  end;
  TSafeArray = tagSAFEARRAY;
  {$EXTERNALSYM SAFEARRAY}
  SAFEARRAY = TSafeArray;
Gruss und nochmal Danke für deine Hilfe.

Edit:
Ich muss den TMemoryStream an ein PsafeArray übergeben einmal für den Header und eins für die Pixeldaten.

EWeiss 5. Jan 2014 13:07

AW: MemoryStream / Bitmap header
 
Ich erstelle nun den BitmapHeader selbst

Delphi-Quellcode:
AtmoCtrlLib.AtmoCreateTransferBuffers(BI_RGB, 4, captureWidth, captureHeight);
Delphi-Quellcode:
var
  size: Integer;
  header: BITMAPINFOHEADER;
  pHeader: Pointer;

begin
  if Assigned(PpixelDataArr) then
    SafeArrayDestroy(PpixelDataArr);

  if Assigned(PbitmapInfoArr) then
    SafeArrayDestroy(PbitmapInfoArr);

    size := width * height * bytePerPixel;
    PpixelDataArr := SafeArrayCreateVector(VT_UI1, 0, size);

    PbitmapInfoArr := SafeArrayCreateVector(VT_UI1, 0, sizeof(BITMAPINFOHEADER));

    pHeader := @Header;

    SafeArrayAccessData(PbitmapInfoArr, pHeader);
    Header.biSize := sizeof(BITMAPINFOHEADER);
    Header.biWidth := width;
    Header.biHeight := height;
    Header.biBitCount := bytePerPixel*8;
    Header.biCompression := FourCC;
    SafeArrayUnaccessData(PbitmapInfoArr);
jetzt muss ich nur noch das PpixelDataArr mit Daten füttern das war's dann.

Delphi-Quellcode:
AtmoCtrlLib.AtmoSendPixelData;
Delphi-Quellcode:
procedure TAtmoCtrlLib.AtmoSendPixelData; stdcall;
var
  pALVC: IAtmoLiveViewControl;

begin
  pALVC := getAtmoLiveViewControl;
  if Assigned(PpixelDataArr) and Assigned(pALVC) then
  begin
    SafeArrayUnaccessData(PpixelDataArr);
    pALVC.setPixelData(PbitmapInfoArr, PpixelDataArr);
  end;

end;

gruss

EWeiss 4. Mai 2014 08:07

AW: MemoryStream / Bitmap header
 
Muss das nochmal rauskramen..
@Aphton du schreibst hier

http://www.delphipraxis.net/newreply...ime=1399187118

Zitat:

Was soll denn bitte
reader.ReadBytes(4 + 4 + 4 + 2 + 2 + 4 + 4 + 4 + 4 + 4 + 4);
bedeuten?
wie kann man es besser machen?
Das es passt und jeder weis was gemeint ist?
Nicht übersetzt in C#

Code:
reader.ReadBytes(sizeof(bmiInfoHeader));
nur dann werden auch die ersten ausgeschlossenen 14 Bytes addiert oder?
Code:
reader.ReadBytes(14); // skip bitmap file info headerbyte[]
Gesamter Code nochmal..
Code:
BinaryReader reader = new BinaryReader(stream);
stream.Position = 0; // ensure that what start at the beginning of the stream.
reader.ReadBytes(14); // skip bitmap file info header
byte[] bmiInfoHeader = reader.ReadBytes(4 + 4 + 4 + 2 + 2 + 4 + 4 + 4 + 4 + 4 + 4);
byte[] pixelData = reader.ReadBytes((int)(stream.Length - stream.Position));
Ich denke mal die wollten den Umweg über den bmiInfoHeader (struct) vermeiden.
Zu viel Arbeit? Oder was sollte das bezwecken. ;)

gruss


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:09 Uhr.
Seite 2 von 2     12   

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