![]() |
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))); |
AW: MemoryStream / Bitmap header
Zitat:
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 |
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:
Gruss und nochmal Danke für deine Hilfe.
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; Edit: Ich muss den TMemoryStream an ein PsafeArray übergeben einmal für den Header und eins für die Pixeldaten. |
AW: MemoryStream / Bitmap header
Ich erstelle nun den BitmapHeader selbst
Delphi-Quellcode:
AtmoCtrlLib.AtmoCreateTransferBuffers(BI_RGB, 4, captureWidth, captureHeight);
Delphi-Quellcode:
jetzt muss ich nur noch das PpixelDataArr mit Daten füttern das war's dann.
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);
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 |
AW: MemoryStream / Bitmap header
Muss das nochmal rauskramen..
@Aphton du schreibst hier ![]() Zitat:
Das es passt und jeder weis was gemeint ist? Nicht übersetzt in C#
Code:
nur dann werden auch die ersten ausgeschlossenen 14 Bytes addiert oder?
reader.ReadBytes(sizeof(bmiInfoHeader));
Code:
Gesamter Code nochmal..
reader.ReadBytes(14); // skip bitmap file info headerbyte[]
Code:
Ich denke mal die wollten den Umweg über den bmiInfoHeader (struct) vermeiden.
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)); Zu viel Arbeit? Oder was sollte das bezwecken. ;) gruss |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:09 Uhr. |
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