AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Multimedia MemoryStream / Bitmap header
Thema durchsuchen
Ansicht
Themen-Optionen

MemoryStream / Bitmap header

Ein Thema von EWeiss · begonnen am 4. Jan 2014 · letzter Beitrag vom 4. Mai 2014
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Zacherl
Zacherl

Registriert seit: 3. Sep 2004
4.629 Beiträge
 
Delphi 10.2 Tokyo Starter
 
#11

AW: MemoryStream / Bitmap header

  Alt 4. Jan 2014, 14:24
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)));
Projekte:
- GitHub (Profil, zyantific)
- zYan Disassembler Engine ( Zydis Online, Zydis GitHub)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#12

AW: MemoryStream / Bitmap header

  Alt 4. Jan 2014, 14:50
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
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#13

AW: MemoryStream / Bitmap header

  Alt 4. Jan 2014, 16:04
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.

Geändert von EWeiss ( 4. Jan 2014 um 21:48 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#14

AW: MemoryStream / Bitmap header

  Alt 5. Jan 2014, 13:07
Ich erstelle nun den BitmapHeader selbst

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.

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

Geändert von EWeiss ( 5. Jan 2014 um 13:09 Uhr)
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#15

AW: MemoryStream / Bitmap header

  Alt 4. Mai 2014, 08:07
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

Geändert von EWeiss ( 4. Mai 2014 um 09:45 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 06:31 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