Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#18

AW: Nach CopyMemory werden Daten nicht übernommen

  Alt 6. Jan 2014, 22:56
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

Geändert von EWeiss (11. Jul 2019 um 16:42 Uhr)
  Mit Zitat antworten Zitat