Sollte analog zum Header folgendermaßen funktionieren:
Delphi-Quellcode:
var
Data: Pointer;
{ ... }
size := width * height * bytePerPixel;
PpixelDataArr := SafeArrayCreateVector(VT_UI1, 0, size);
SafeArrayAccessData(PpixelDataArr, Data);
CopyMemory(Data, Pointer(NativeUInt(BitmapStream.Memory) + SizeOf(TBitmapFileHeader) + SizeOf(TBitmapInfoHeader)), size);
SafeArrayUnaccessData(PpixelDataArr);
Danke dir..
Ich habe es mittlerweile gelöst es gibt aber noch ein paar kleine Probleme mit der Bitmap.
Ich denke 1 Pixel als Rahmen gezeichnet ist einfach zu wenig werde da mal stufenweise erhöhen da er mir sonst
alle Fenster als Magenta anzeigt.
Ich musste den Zeiger von .bmBits in den Array Deskriptor setzen.
Das ging nur über OLEVariant zusätzlich mußte ich das Bitmap auf 24Bit setzen (ohne Alpha Channel).
Delphi-Quellcode:
if AtmoInitialize then
begin
BitmapStream := TMemoryStream.Create;
Background.SaveToStream(BitmapStream);
BitmapStream.Position := 0;
Background.LoadFromStream(BitmapStream);
BitmapStream.Position := 0;
BitmapStream.Read(BitmapFileHeader, SizeOf(TBitmapFileHeader));
BitmapStream.Read(BitmapInfoHeader, SizeOf(TBitmapInfoHeader));
pheader := @BitmapInfoHeader;
AtmoCtrlLib.AtmoCreateTransferBuffers( BI_RGB, 3, BitmapInfoHeader.biWidth,
BitmapInfoHeader.biHeight);
GetObject(Background.Handle, SizeOf(Bmp), @Bmp);
size := Bmp.bmWidth * Bmp.bmHeight * Bmp.bmBitsPixel;
PpixelDataArr := SafeArrayCreateVector(VT_UI1, 0, size);
bitMapSize := Bmp.bmWidth * Bmp.bmHeight;
VariantInit(ValOUT);
TVariantArg(ValOUT).VT := VT_ARRAY or VT_UI1;
rgsabound[0].cElements := bitMapSize;
rgsabound[0].lLbound := 0;
TVariantArg(ValOUT).parray := SafeArrayCreate(VT_UI1, 1, rgsabound);
if Assigned(TVariantArg(ValOUT).parray) then
begin
SafeArrayAccessData(TVariantArg(ValOUT).parray, pArrayData);
CopyMemory(pArrayData, Bmp.bmBits, bitMapSize);
SafeArrayCopy(TVariantArg(ValOUT).parray, PpixelDataArr);
SafeArrayUnaccessData(TVariantArg(ValOUT).parray);
VariantClear(ValOUT);
end;
AtmoCtrlLib.AtmoSendPixelData;
DeleteObject(Background.Handle);
FreeAndNil(BitmapStream);
end;
FreeAndNil(Background);
Hab auch noch ein paar Speicherlecks die ich finden muss.
Nach dieser Änderung.
Bei der ganzen Sache ist halt das Problem das man nicht oder sehr wenig Informationen über diese Thematik hat.
Aber wie man sieht geht es wenn man nur am Ball bleibt
gruss